我在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
Run Code Online (Sandbox Code Playgroud)
我测试了很多这个1000万阈值的值,发现值匹配(虽然我承认没有测试超过10个输出行).
谁知道这里发生了什么?这个1000万的数字有什么重要意义吗?
是的,有一些特别的东西1e7.如果你查看sample代码,它最终会调用sample.int.正如你可以看到在?sample,默认值的useHash说法sample.int是
useHash = (!replace && is.null(prob) && size <= n/2 && n > 1e7)
Run Code Online (Sandbox Code Playgroud)
这&& n > 1e7意味着当您达到上述时1e7,默认首选项将切换为useHash = TRUE.如果需要一致性,请sample.int直接调用并指定useHash值.(TRUE对于内存效率是一个很好的选择,?sample有关详细信息,请参阅参数说明.)