4

ドキュメントから:

ループ内のRandomizeの呼び出しとRandom関数の呼び出しを組み合わせないでください。通常、Randomizeは、Randomを呼び出す前に、一度だけ呼び出されます。

(私による「一度だけ」の強調表示)

ベストプラクティスの質問:

Delphiライブラリがを使用する場合、Randomの初期化呼び出しの要件のみを文書Randomize化し、Randomizeの呼び出しをライブラリのユーザーに任せる必要がありますか?

または、ライブラリが初期化を処理する必要があります。

if System.RandSeed = 0 then Randomize;
4

3 に答える 3

5

私の謙虚な意見では、それはあなたの図書館の構造と目的に完全に依存します。

ユーザーにランダム呼び出しが表示されない場合は、ライブラリに常に初期化させることをお勧めします。ドキュメントに入れる必要はありません。

一方、ユーザーが実際にライブラリを使用してランダムまたはそのラッパーを直接呼び出す場合(これはライブラリの動作方法だと思います)、ユーザーはある種のランダムを使用していることに気付くはずです-ほとんどの言語のランダムシーケンスは実際にはシードに基づく疑似ランダムシーケンスであるため、初期化を必要とする関数を生成します。

ユーザーがランダムシーケンスを数回初期化する必要がある場合もあれば、1回だけ初期化することに満足している場合もあります。それは完全にユーザーのニーズに依存します。

私はそれを強制するのではなく、Randomize呼び出しをユーザーが利用できるようにし、初期化を処理するか、ユーザーに任せるようにライブラリに指示する可能性をユーザーに提供します。そしてこの場合、すべてを文書化する必要があります。

HTH

于 2012-06-23T10:13:15.620 に答える
2

よくわからない場合は、常にrandomize()を呼び出してください。 コードが呼び出されない
という事実よりも、呼び出されるという事実に依存するようにする方がよいでしょう。

これは、randomrandomizeがアプリケーションに対してグローバルであり、他のユニットまたはコードの一部が、ある時点でrandomize()を呼び出すかどうかを確実に知ることができないためです。

これらのグローバル機能があると便利ですが、実際にはクリーンなデザインではありません。TRandomizerクラスの方がおそらく優れており、アプリケーションの他の部分に影響を与えることなく、特定のスコープのシードを設定できます。

これはDOS時代の残り物だと思います。

于 2012-06-23T14:33:19.407 に答える
1

ライブラリ初期化ルーチンには、ユーザーがライブラリ内のRandomize()を呼び出すかどうかを選択できるブールパラメータをいつでも提供できます。Delphi XE(?)RTLソース以降、Randomize()が複数回呼び出されることにも注意してください。

カスタムRNGを使用できます。たとえば、XorShiftを使用して乱数をポン引きできます。単純なXorShiftでさえ、Delphiの内部疑似RNGよりも優れているようです:|

于 2012-06-23T11:09:43.017 に答える