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で作業しています。
本当の問題は、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
に評価するためにそれらを信頼できます。
どうしてできないのか分からない...
_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
に調整する必要があることを指摘しています
floor(runif(10000,min=0,max=(10^12)))
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)
パッケージ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 ...