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

问题描述 投票:17回答:5

我想生成介于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位操作系统。

r random numbers range
5个回答
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


23
投票

我不明白为什么你不能做...

sample(10^12,10,replace=TRUE)
#[1] 827013669653 233988208530 653034892160 564841068001 801391072663 683607493313
#[7] 254556497302 510154570389  51922126428 537709431414

如果xlength 1,是numeric(在is.numeric意义上)和x >= 1,通过样本取样来自1:x

注:这并不意味着sample必须生成矢量1:x !! @James指出,对于0:x的采样,你需要调整到sample(10^12+1,10,replace=TRUE)-1


1
投票
floor(runif(10000,min=0,max=(10^12)))

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)

0
投票

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 ...
© www.soinside.com 2019 - 2024. All rights reserved.