web-dev-qa-db-ja.com

Piを粗雑な乱数ジェネレータとして使用できますか?

私は最近、math.SEで this の質問を見ました。考えさせられました。 Piを粗雑な乱数ジェネレータとして使用できますか?結果はよく知られていることを意味します(現在までにpiはどのくらい計算されていますか)。

これはまったく意味がありますか?

30
Earlz

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の平方根を2進数で計算し、同じ問題のセットを取り戻しました。 Wolfram's Iteration を使用して、簡単な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 だったので、シーケンスがあると確信しました。値v 最初の桁の後に配置された2進小数点を使用して2進で書かれたときのように、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).
50
user40980

まあ、乱数ジェネレーターの他のプロパティの中で、おそらく 通常の数 にしたいでしょう。そして、あなたの質問に影響を与えたmath.SEの質問のいくつかの回答は、現在のpiは正常であると信じられていることを指摘していますが、それは証明されていません。

5
psr

このようなジェネレーターは、疑似番号ジェネレーターです。つまり、同じシードを指定すると、結果は常に同じになります。ただし、ほとんどのフレームワークでは、標準の乱数ジェネレータを使用すると、疑似乱数になるという同じ問題があります。

数字の分布は、標準の乱数生成器¹と非常によく似ているため、πの数字は通常の乱数生成シナリオに使用できます。

問題は、通常の乱数ジェネレーターと比較して、アルゴリズムがおそらく非常に遅いため、実際にはあまり役に立たないことです。


¹事実だと思いますが、証拠はありません。大量の数値に基づいて比較を行うのは興味深いことです(複雑にするのではありません)。

2

Piの数字のランダム性(または、さらに言えば他のシーケンス)は、いわゆる「バッテリーテスト」によって間違いなくテストできます。人気のあるバッテリーテストの1つは、George Marsagliaの Diehardバッテリーテスト です。また、そのようなテストの数と、これらのテストを100万ビットを超える-loおよびbehold-piを含む多くの物理定数に適用した結果を説明する NIST Special Publication 800-22 もあります。 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は良いランダムシーケンスジェネレーターですか?上記の結果を見て(または、意味がわからない場合は、左の列変数の意味を検索して)、それがニーズを満たしているかどうかを確認します。

2
sm535