6

だから私は、ゲームのために、特定のサイコロを振る確率の計算をテストしています。1 つの 10 面サイコロを転がす場合の基本ケース。

これを 100 万回サンプリングした結果、次の比率になりました。

Result
0       0.000000000000000%
1       10.038789961210000%
2       10.043589956410000%
3       9.994890005110000%
4       10.025289974710000%
5       9.948090051909950%
6       9.965590034409970%
7       9.990190009809990%
8       9.985490014509990%
9       9.980390019609980%
10      10.027589972410000%

もちろん、これらはすべて 10% である必要があります。これらの結果には 0.0323207% の標準偏差があります。それは、私にはかなり高いようです。単なる偶然ですか?私が理解しているように、ランダムモジュールは適切な擬似乱数にアクセスします。つまり、ランダムであるという統計テストに合格するメソッドからのものです。または、これらの疑似疑似乱数ジェネレーターですか

暗号疑似乱数ジェネレーターを使用する必要がありますか? 真の乱数ジェネレーターは必要ないと確信しています( http://www.random.org/http://en.wikipedia.org/wiki/Hardware_random_number_generatorを参照)。

現在、10 億のサンプルを使用してすべての結果を再生成しています (なぜなら、自由に使えるサクサクしたサーバーがあり、少し眠る必要があるからです)。

4

6 に答える 6

17

randomモジュールのドキュメントから:

ほとんどすべてのモジュール関数は、半開放範囲 [0.0, 1.0) でランダムなフロートを一様に生成する基本関数 random() に依存しています。Python は Mersenne Twister をコア ジェネレータとして使用します。53 ビット精度の浮動小数点数を生成し、周期は 2**19937-1 です。C での基礎となる実装は、高速かつスレッドセーフです。Mersenne Twister は、現存する乱数ジェネレーターの中で最も広範囲にテストされたものの 1 つです。ただし、完全に決定論的であるため、すべての目的に適しているわけではなく、暗号化の目的にはまったく適していません。

Mersenne Twister に関するウィキペディアの記事から:

古いアルゴリズムに見られる欠陥の多くを修正するために特別に設計された、非常に高品質の疑似乱数の高速生成を提供します。

OS 固有の乱数ソースを から入手できる場合は、代わりにクラスos.urandom()を使用できます。random.SystemRandom()モジュール関数のほとんどは、randomそのクラスのメソッドとして利用できます。ドキュメントを再度引用すると、暗号化の目的により適している可能性があります。

返されるデータは、暗号化アプリケーションにとって十分に予測不可能である必要がありますが、その正確な品質は OS の実装によって異なります。

Python 3.6 では、暗号化の目的に適したランダム データを生成する便利なメソッドを備えたsecretsモジュールが追加されています。

このsecretsモジュールは、パスワード、アカウント認証、セキュリティ トークン、および関連する秘密などのデータの管理に適した、暗号的に強力な乱数を生成するために使用されます。

特に、モジュールsecrets内のデフォルトの疑似乱数ジェネレーターよりも優先して使用する必要がありrandomます。これは、セキュリティや暗号化ではなく、モデリングとシミュレーション用に設計されています。

于 2012-08-28T17:18:01.383 に答える
4

OPの演習を10億回繰り返して再実行しました。

from collections import Counter
import random
n = 1000000000
c = Counter(random.randint(1, 10) for _ in xrange(n))
for i in range(1,11):
    print '%2s  %02.10f%%' % (i, c[i] * 100.0 / n)

(再フォーマットされた)結果は次のとおりです。

 1     9.9996500000%
 2    10.0011089000%
 3    10.0008568000%
 4    10.0007495000%
 5     9.9999089000%
 6     9.9985344000%
 7     9.9994913000%
 8     9.9997877000%
 9    10.0010818000%
10     9.9988307000%

優れた分析については、この質問に対する他の回答を参照してください。

于 2012-08-28T18:55:38.723 に答える
3

Martijn の答えは、Python がアクセスできる乱数ジェネレーターのかなり簡潔なレビューです。

生成された疑似乱数データの特性を調べたい場合は、http://www.fourmilab.ch/random/random.zipからダウンロードして、乱数データの大きなサンプルで実行してください。特に χ² (カイ 2 乗) 検定はランダム性に非常に敏感です。シーケンスが本当にランダムであるためには、χ² 検定のパーセンテージが 10% から 90% の間でなければなりません。

ゲームの場合、Python が内部的に使用する Mersenne Twister は十分にランダムであるべきだと思います (オンライン カジノを構築している場合を除きます :-)。

純粋なランダム性が必要で、Linux を使用している場合は、/dev/random. これは、カーネルのエントロピー プール (割り込みが到着する予測不可能な時間から収集される) からランダム データのみを生成するため、それを使い果たすとブロックされます。このエントロピーは、によって使用される PRNG を初期化 (シード) するために使用され/dev/urandomます。FreeBSD では、データを提供する PRNG/dev/randomは、一般に暗号学的に安全であると見なされている Yarrow アルゴリズムを使用します。

編集:からのバイトでいくつかのテストを実行しましたrandom.randint。最初に 100 万バイトのランダムなバイトを作成します。

import random
ba = bytearray([random.randint(0,255) for n in xrange(1000000)])
with open('randint.dat', 'w+') as f:
    f.write(ba)

次に、 Fourmilabentのプログラムを実行しました。

Entropy = 7.999840 bits per byte.

Optimum compression would reduce the size
of this 1000000 byte file by 0 percent.

Chi square distribution for 1000000 samples is 221.87, and randomly
would exceed this value 93.40 percent of the times.

Arithmetic mean value of data bytes is 127.5136 (127.5 = random).
Monte Carlo value for Pi is 3.139644559 (error 0.06 percent).
Serial correlation coefficient is -0.000931 (totally uncorrelated = 0.0).

χ² 検定では、50% から離れるほど、データの疑わしさが増します。非常にうるさい場合、<10% または >90% の値は受け入れられないと見なされます。の著者であるジョン・ウォーカーは、entこの値を「ほぼ疑わしい」と呼んでいます。

対照的に、以前に実行した FreeBSD の Yarrow prng からの 10 MiB の同じ分析を次に示します。

Entropy = 7.999982 bits per byte.

Optimum compression would reduce the size
of this 10485760 byte file by 0 percent.

Chi square distribution for 10485760 samples is 259.03, and randomly
would exceed this value 41.80 percent of the times.

Arithmetic mean value of data bytes is 127.5116 (127.5 = random).
Monte Carlo value for Pi is 3.139877754 (error 0.05 percent).
Serial correlation coefficient is -0.000296 (totally uncorrelated = 0.0).

他のデータにはあまり違いがないように見えますが、χ² の割合は50% にかなり近くなっています。

于 2012-08-28T18:00:41.677 に答える
2

はい、すべての実用的な目的で統計的にランダムです。あなたが見たランダムな変動は完全に正常です。実際、そのようなバリエーションがなければ、RNG は良くありません。

prng の周期は 2**19937-1 であるため、ランダムでない分布を確認するには、宇宙にある原子よりも多くの数を生成する必要があります。623 次元のベクトルを生成すると、すぐに非ランダムになることに注意してください。

于 2012-08-28T17:18:37.493 に答える
1

乱数が適切な PRNG で不完全に分散されるのは、実際には正常なことです。ただし、生成する数値が多いほど、それが見えにくくなります。

ところで、私は 0.03066 の標準偏差を取得しています。これは、あなたが与えたものよりわずかに低くなっています。

于 2012-08-28T18:14:48.140 に答える
1

これらの結果は、予想に非常に近いものであり、それを確認するために実行できる簡単な計算があります。D10 を 1,000,000 ロールして 1 の数を数えると (たとえば)、確率変数の平均は 100,000 (試行回数 * 成功確率) で、分散は 90,000 (試行回数 * 成功確率 * 失敗確率) です。したがって、標準偏差は sqrt(90,000)=300 です。したがって、100,000 から約 300、つまり 10% +/- 0.03% 離れていると予想する必要があります。

于 2016-12-13T11:05:12.233 に答える