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.intuseHash 参数的默认值为

useHash = (!replace && is.null(prob) && size <= n/2 && n > 1e7)

&& n > 1e7 意味着当您超过 1e7 时,默认首选项会切换到 useHash = TRUE。如果你想要一致性,直接调用 sample.int 并指定 useHash 值。 (TRUE 是内存效率的不错选择,有关详细信息,请参阅 ?sample 处的参数说明。)