私は最近math.SEでこの質問を見ました。考えさせられました。Piは粗雑な乱数ジェネレーターとして使用できますか?私は結果がよく知られていることを意味します(これまでどのくらいのpiが計算されましたか?)が、一度に1桁の数字をとるとPiはかなりランダムに見えるようです。
これはまったく意味がありますか?
私は最近math.SEでこの質問を見ました。考えさせられました。Piは粗雑な乱数ジェネレーターとして使用できますか?私は結果がよく知られていることを意味します(これまでどのくらいのpiが計算されましたか?)が、一度に1桁の数字をとるとPiはかなりランダムに見えるようです。
これはまったく意味がありますか?
回答:
http://www.befria.nu/elias/pi/binpi.htmlから掘り下げてpiのバイナリ値を取得し(10進数を使用するよりもバイトに変換する方が簡単だったため)、entで実行するバイトのランダムな分布を分析すると、次のようになります。
エントロピー= 7.954093ビット/バイト。
最適な圧縮により、この4096バイトのファイルのサイズが0%削減されます。
4096サンプルのカイ二乗分布は253.00であり、ランダムにこの値の52.36%を超えます。
データバイトの算術平均値は126.6736(127.5 =ランダム)です。
Piのモンテカルロ値は3.120234604(エラー0.68%)です。
シリアル相関係数は0.028195(完全に無相関= 0.0)です。
そうです、ランダムデータにpiを使用すると、かなりランダムなデータが得られます...それがよく知られているランダムデータであることを認識しています。
上記のコメントから...
何をしているのかにもよりますが、任意の素数の平方根の小数を乱数ジェネレータとして使用できると思います。これらは、少なくとも均等に分配された数字である必要があります。–パクシナム
そこで、2の平方根をバイナリで計算して、同じ問題のセットを解除しました。Wolframの反復を使用して、簡単なperlスクリプトを書きました
#!/usr/bin/perl
use strict;
use Math::BigInt;
my $u = Math::BigInt->new("2");
my $v = Math::BigInt->new("0");
my $i = 0;
while(1) {
my $unew;
my $vnew;
if($u->bcmp($v) != 1) { # $u <= $v
$unew = $u->bmul(4);
$vnew = $v->bmul(2);
} else {
$unew = ($u->bsub($v)->bsub(1))->bmul(4);
$vnew = ($v->badd(2))->bmul(2);
}
$v = $vnew;
$u = $unew;
#print $i," ",$v,"\n";
if($i++ > 10000) { last; }
}
open (BITS,"> bits.txt");
print BITS $v->as_bin();
close(BITS);
これを最初の10個のA095804と一致させて実行したので、シーケンスがあると確信しました。2進小数点を最初の桁の後に配置して2進で記述した場合の値v nは、2の平方根の近似値を与えます。
このバイナリデータに対してentを使用すると、以下が生成されます。
Entropy = 7.840501 bits per byte.
Optimum compression would reduce the size
of this 1251 byte file by 1 percent.
Chi square distribution for 1251 samples is 277.84, and randomly
would exceed this value 15.58 percent of the times.
Arithmetic mean value of data bytes is 130.0616 (127.5 = random).
Monte Carlo value for Pi is 3.153846154 (error 0.39 percent).
Serial correlation coefficient is -0.045767 (totally uncorrelated = 0.0).
このようなジェネレーターは擬似番号ジェネレーターになります。つまり、同じシードを指定すると、結果は常に同じになります。これは、ほとんどのフレームワークで、標準の乱数ジェネレーターを使用すると、擬似乱数であるという同じ問題があると言われています。
数字の分布は標準の乱数ジェネレーター¹と非常に似ているようであるため、πの数字は通常の乱数生成シナリオに使用できます。
問題は、通常の乱数ジェネレーターに比べてアルゴリズムがおそらく非常に遅いため、実際にはあまり役に立たないことです。
¹私はそれが真実だと信じていますが、証拠はありません。大量の数値に基づいて比較を行うのは興味深いことです(複雑にすることはありません)。
piの数字のランダム性(または他のシーケンス)は、いわゆる「バッテリーテスト」によってほぼ間違いなくテストできます。人気のあるバッテリーテストの1つは、ジョージマルサグリアのDiehard Battery Testです。また、NIST Special Publication 800-22には、このようなテストの多くと、これらのテストを-loおよびbehold-百万ビット以上のpiを含む多くの物理定数に適用した結果が記載されています。piの結果はレポートの付録Bに記載されており、次のようになります。
Statistical Test P-value
Frequency 0.578211
Block Frequency (m = 128) 0.380615
Cusum-Forward 0.628308
Cusum-Reverse 0.663369
Runs 0.419268
Long Runs of Ones 0.024390
Rank 0.083553
Spectral DFT 0.010186
Non-overlapping Templates (m = 9, B = 000000001) 0.165757
Overlapping Templates (m = 9) 0.296897
Universal 0.669012
Approximate Entropy (m = 10) 0.361595
Random Excursions (x = +1) 0.844143
Random Excursions Variant (x = -1) 0.760966
Linear Complexity (M = 500) 0.255475
Serial (m = 16, 2m∇Ψ ) 0.143005
piは良いランダムシーケンスジェネレーターですか?上記の結果を見て(または、左の列の変数の意味がわからない場合は、その意味を検索して)、それがニーズを満たしているかどうかを確認してください。