从范围(0:10 ^ 12)生成整数随机数

时间:2013-11-07 12:14:10

标签: r random numbers range

我想在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位操作系统。

5 个答案:

答案 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
  

如果xlength 1numericis.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 ...