我想生成介于0到10 ^ 12之间的10000个整数随机数。通常,代码看起来像这样:
x <- sample(0:1000000000000,10000,replace=T)
但我收到以下错误消息:
Error in 0:1000000000000 : result would be too long a vector
是否有一个更有效的内存方法,不必将10 ^ 12个整数放在向量中,只是为了获得大小为10000的样本?如果没有,有没有办法增加向量的最大大小?我正在使用具有12GB可用RAM的64位操作系统。
真正的问题在于你不能将0:10^12
的序列存储到内存中。通过将0和10 ^ 12定义为均匀分布的边界,您可以获得所需的内容:
runif(10000, 0, 10^12)
[1] 136086417828 280099797063 747063538991 250189170474 589044594904
[6] 65385828028 361086657969 186271687970 338900779840 649082854623 ........
这将取自均匀分布(有替换,但我怀疑这很重要)。
但是,你看不到的是这些实际上是浮点数。
你可以使用ceiling
来围绕它们:
samp = runif(1, 0, 10^12)
samp
[1] 19199806033
samp == 19199806033
[1] FALSE
ceiling(samp) == 19199806033
[1] TRUE
所以完整的代码将是:
ceiling(runif(10000, 0, 10^12))
进一步挑剔:
请注意,这在技术上不允许0(因为0.0001将被四舍五入),所以你可以从中抽取
ceiling(runif(10000, -1, 10^12))
正如Carl Witthoft所提到的那样,不符合整数大小的数字显然不是整数,所以你不能指望这些数字是整数。当你与没有小数的相同浮动数字相比时,你仍然可以指望它们评估为TRUE
。
我不明白为什么你不能做...
sample(10^12,10,replace=TRUE)
#[1] 827013669653 233988208530 653034892160 564841068001 801391072663 683607493313
#[7] 254556497302 510154570389 51922126428 537709431414
如果
x
有length 1
,是numeric
(在is.numeric
意义上)和x >= 1
,通过样本取样来自1:x
。
注:这并不意味着sample
必须生成矢量1:x
!! @James指出,对于0:x
的采样,你需要调整到sample(10^12+1,10,replace=TRUE)-1
floor(runif(10000,min=0,max=(10^12)))
as.integer(runif(10000, min = 0, max = (1 + 10^12)))
仅供参考:as.integer
执行截断,而不是舍入。
为了测试它是否有效,你可以尝试在较小的间隔(即0到6)中生成数字,并可视化结果的直方图,看看结果是否是均匀分布,即
test <- as.integer(runif(10000, min = 0, max = (6 + 1)))
hist(test)
包extraDistr
为样本提供了一系列附加概率分布,包括离散均匀分布。
函数rdunif
的随机抽样就像其他stats
随机抽样函数一样工作,像runif
一样,并且避免像其他解决方案那样需要舍入:
> library("extraDistr")
> rdunif(n = 10000, min = 0, max = 10^12)
[1] 699559531175 881392957410 315869810758 941600866616
[5] 906084092567 681591022527 514061764115 122652820777
[9] 583204373950 517842726316 741211620393 422150962055 ...