我想在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 :(得分:27)
真正的问题在于你无法将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
。
答案 1 :(得分:23)
我不明白你为什么不能这样做......
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
通过样本进行抽样}。
N.B。这并不意味着sample
必须生成向量1:x
!! @James 指出,对于0:x
的抽样,您需要调整为sample(10^12+1,10,replace=TRUE)-1
答案 2 :(得分:1)
floor(runif(10000,min=0,max=(10^12)))
答案 3 :(得分:0)
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)
答案 4 :(得分:0)
软件包extraDistr
提供了一系列其他概率分布以供抽样,其中包括离散均匀分布。
带有函数rdunif
的随机采样的工作方式与stats
一样,与R附带的其他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 ...