25

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

4

5 回答 5

33

真正的问题在于您无法将序列存储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不过,与没有小数的相同浮点数相比,您仍然可以依靠它们进行评估。

于 2013-11-07T12:18:59.400 回答
23

I do not understand why you cannot just do...

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

If x has length 1, is numeric (in the sense of is.numeric) and x >= 1, sampling via sample takes place from 1:x.

N.B. This does not mean that sample has to generate the vector 1:x!! @James points out that for sampling of 0:x you will need to adjust to sample(10^12+1,10,replace=TRUE)-1

于 2013-11-07T12:41:38.863 回答
1
floor(runif(10000,min=0,max=(10^12)))
于 2015-05-10T23:15:09.953 回答
1
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)
于 2015-08-18T14:25:02.420 回答
0

该软件包extraDistr提供了一系列额外的概率分布可供抽样,包括离散的均匀分布

带有函数的随机采样与 R like 中包含的rdunif其他随机采样函数一样工作,并且避免像其他解决方案一样需要舍入:statsrunif

> 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 ...
于 2018-09-18T01:44:43.210 回答