12

Delphi (Delphi である必要があります) で統計テストを作成するプログラムを作成していますが、ランダム機能がやや奇妙であると聞きました。プログラムの開始時に randomize を呼び出して、random 関数のシードをランダム化する必要があります。

ランダム関数 (randomize を呼び出した後) が統計テストに十分なランダムかどうか、またはメルセンヌツイスターが必要かどうか疑問に思っていますか? これがどれほど重要であるかを教えてくれるランダムの実際の実装についての洞察を誰かが持っていますか?

4

9 に答える 9

20

Delphi の PRNG は、ほぼすべてのプログラミング言語の RTL PRNG と同様に、線形合同ジェネレータです。

ほとんどの小規模なものには十分ですが、注意すべき点があります。特に、下位ビットに注意してください。乗算と加算のパターンは、下位ビットがまったくランダムではないことを意味します。ただし、これは通常、引き出されて切り捨てられた、modまたは同様の大きな 32 ビット値にのみ適用されます。を使用Random(10)して 0 ~ 9 の値を内部的に抽出すると、演算ではなく 32 ビット範囲全体で乗算が使用されますmod

于 2010-10-16T00:47:17.520 に答える
17

代替テキスト

私は抵抗できませんでした。

于 2010-10-16T00:46:30.487 に答える
6

最速の実行時間で乱数の一意性を保証する方法を探している場合、About.comは最速の一意の乱数ジェネレーターに挑戦し、PatrickvanLogchemの実装が勝者として選ばれました。

于 2010-10-16T01:56:29.243 に答える
6

が統計検定に十分に信頼できるかどうかRandomは、使用するコンテキストによって異なります。

そうは言っても、適切な統計を行う必要があるいくつかの Delphi コードを作成し、Randomたとえば、さまざまなヌル分布、データの疑似複製、およびリサンプリングを取得するために使用しました。これまでのところ、私自身のコードで、Random偏った結果や信頼できない結果をもたらしたケース、または意図した統計テストでの使用を妨げた結果に遭遇したことはありません。しかし、私のコードに当てはまることが必ずしもあなたのコードに当てはまるとは限りません。

疑問がある場合は、Random(たとえば、R、SPSS などで) への呼び出しの結果を統計的に分析し、結果の分布が特定の統計テストの分布要件に違反しているかどうかを調べることができます。[あなたがまともな科学者なら、とにかくこれはあなたがすべきことです。]

他の PRNG が必要な場合 - たとえばTPMathライブラリにはいくつか含まれています。(より複雑なことについては、Delphi を介して R から精巧な統計関数を呼び出すオプションもあります。)

于 2010-10-16T12:34:12.730 に答える
4

比較的難解なハードウェアを購入しない限り、コンピューターが提供できる乱数の最良の近似は、完全に決定論的な疑似乱数シーケンスです。一般に、ランダム化関数は、疑似ランダムシーケンスへのエントリポイントを提供するシードとして、比較的ランダムな値(多くの場合、時間に基づいていますが、マウスの動きに基づく場合もあります。Delphiが何をするのかわかりません)を使用します。これがないと、毎回同じ順序で同じ乱数のセットが返されることになり、そもそも乱数を使用する目的が損なわれる傾向があります。

さて、これは信頼性に関する質問に答えるものではないことは理解していますが、ランダム化を呼び出すことを要求することは、悪いジェネレータではなく、良いジェネレータの兆候であるという自信を与えるはずです。一連の数字がどれほどランダムであるかを示す統計テストがたくさんあります。Delphi乱数ジェネレーターは成熟した製品であるため、多くの目的に適している可能性があります。

于 2010-10-16T00:00:14.167 に答える
3

可能性のプールに追加するだけで、Windows にはさまざまな組み込みの暗号化機能が用意されています。デフォルトでまだ含まれていない場合は、おそらくそれらの Delphi ラッパーもあります。

これらの機能の中には、暗号的に強力な乱数ジェネレーターもあります。これは、非常に長い要素リストに基づいて自分自身をシードするため、ソフトウェアで得られる最高のランダム性です。よくわかりませんが、ハードウェア乱数ジェネレーターがあればそれも使用すると思います。

それでも不十分な場合は、Quantum Random Bit Generator Serviceにサインアップして、いくつかの本当にランダムな値を取得することもできます。

于 2010-10-17T15:49:10.453 に答える
2

私が分析してから実装が変更されていない場合(Delphi 4 IIRC)、Delphi PRNG は次のように実装されています。

Randseed:=int32(Randseed*$08088405)+1
result:=Randseed*Range shr 32

(疑似コード/乗算が任意の大きな整数であると仮定)

于 2010-10-17T15:46:50.850 に答える
2

エンバカデロの Web サイトから:

_lrand は長い乱数ジェネレーター関数です。_rand は、周期が 2^64 の乗法的合同乱数ジェネレーターを使用して、0 から 2^31 - 1 の範囲の連続する疑似乱数を返します。

ジェネレーターは、引数値 1 で srand を呼び出すことによって再初期化されます。指定されたシード番号で srand を呼び出すことによって、新しい開始点に設定できます。

于 2010-10-17T15:35:01.600 に答える
-2

0..9の間でランダムに返す

StrToInt(copy(FloatToStr(Random),4,1))

注:使用する前にFloatToStr(Random)の長さを確認するか、小数部の他の桁を使用してください。

于 2012-09-11T10:04:13.557 に答える