web-dev-qa-db-ja.com

範囲(0:10 ^ 12)から整数の乱数を生成します

0〜10 ^ 12の10000個の整数の乱数を生成したい。通常、コードは次のようになります。

x <- sample(0:1000000000000,10000,replace=T)

しかし、次のエラーメッセージが表示されます。

Error in 0:1000000000000 : result would be too long a vector

サイズ10000のサンプルを取得するためだけに10 ^ 12個の整数をベクトルに入れる必要のない、よりメモリ効率の良い方法はありますか?そうでない場合、ベクトルの最大サイズを増やす方法はありますか? 12GBの空きRAMを備えた64ビットOSで作業しています。

19
user1775213

本当の問題は、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に評価するためにそれらを信頼できます。

28
PascalVKooten

どうしてできないのか分からない...

_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に調整する必要があることを指摘しています

23
Simon O'Hanlon
floor(runif(10000,min=0,max=(10^12)))
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)
1
Marco Demaio

パッケージextraDistrは、離散均一分布を含む、サンプリングする追加の確率分布の範囲を提供します。

関数rdunifを使用したランダムサンプリングは、Rに含まれる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 ...
0
Umaomamaomao