R 样本函数问题超过 1000 万个值
R sample function issue over 10 million values
我在 R 中发现了这个怪癖,但找不到太多证据来说明它为什么会出现。我试图重新创建一个样本作为检查,发现 sample
函数在某些情况下表现不同。看这个例子:
# Look at the first ten rows of a randomly ordered vector of the first 10 million integers
set.seed(4)
head(sample(1:10000000), 10)
[1] 5858004 89458 2937396 2773749 8135739 2604277 7244055 9060916 9490395 731445
# Select a specified sample of size 10 from this same list
set.seed(4)
sample(1:10000000), size = 10)
[1] 5858004 89458 2937396 2773749 8135739 2604277 7244055 9060916 9490395 731445
# Try the same for sample size 10,000,001
set.seed(4)
head(sample(1:10000001), 10)
[1] 5858004 89458 2937396 2773750 8135740 2604277 7244056 9060917 9490396 731445
set.seed(4)
sample(1:10000001), size = 10)
[1] 5858004 89458 2937397 2773750 8135743 2604278 7244060 9060923 9490404 731445
我测试了许多达到这个 1000 万阈值的值,发现这些值匹配(尽管我承认没有测试超过 10 个输出行)。
有人知道这是怎么回事吗?这1000万个数字有什么意义吗?
是的,1e7
有一些特别之处。如果您查看 sample
代码,它最终会调用 sample.int
。正如您在 ?sample
中所见,sample.int
的 useHash
参数的默认值为
useHash = (!replace && is.null(prob) && size <= n/2 && n > 1e7)
&& n > 1e7
意味着当您超过 1e7
时,默认首选项会切换到 useHash = TRUE
。如果你想要一致性,直接调用 sample.int
并指定 useHash
值。 (TRUE
是内存效率的不错选择,有关详细信息,请参阅 ?sample
处的参数说明。)
我在 R 中发现了这个怪癖,但找不到太多证据来说明它为什么会出现。我试图重新创建一个样本作为检查,发现 sample
函数在某些情况下表现不同。看这个例子:
# Look at the first ten rows of a randomly ordered vector of the first 10 million integers
set.seed(4)
head(sample(1:10000000), 10)
[1] 5858004 89458 2937396 2773749 8135739 2604277 7244055 9060916 9490395 731445
# Select a specified sample of size 10 from this same list
set.seed(4)
sample(1:10000000), size = 10)
[1] 5858004 89458 2937396 2773749 8135739 2604277 7244055 9060916 9490395 731445
# Try the same for sample size 10,000,001
set.seed(4)
head(sample(1:10000001), 10)
[1] 5858004 89458 2937396 2773750 8135740 2604277 7244056 9060917 9490396 731445
set.seed(4)
sample(1:10000001), size = 10)
[1] 5858004 89458 2937397 2773750 8135743 2604278 7244060 9060923 9490404 731445
我测试了许多达到这个 1000 万阈值的值,发现这些值匹配(尽管我承认没有测试超过 10 个输出行)。
有人知道这是怎么回事吗?这1000万个数字有什么意义吗?
是的,1e7
有一些特别之处。如果您查看 sample
代码,它最终会调用 sample.int
。正如您在 ?sample
中所见,sample.int
的 useHash
参数的默认值为
useHash = (!replace && is.null(prob) && size <= n/2 && n > 1e7)
&& n > 1e7
意味着当您超过 1e7
时,默认首选项会切换到 useHash = TRUE
。如果你想要一致性,直接调用 sample.int
并指定 useHash
值。 (TRUE
是内存效率的不错选择,有关详细信息,请参阅 ?sample
处的参数说明。)