6

コンテキストとして数値のプールを作成するシードされた乱数ジェネレーターを探しています。良すぎる必要はありません。これはゲームに使用されますが、ゲームエンジンの各インスタンスに独自の番号のプールがあることが重要です。これにより、さまざまなゲームインスタンスや、乱数を使用するゲームの他の部分でさえ、の決定論的特性が損なわれることはありません。生成された数値。

現在、私はrand()を使用していますが、これには明らかにこの機能がありません。

私がやりたいことを実行できるcまたはobjective-cジェネレーターはありますか?

4

5 に答える 5

7

を使用srandしてシードを設定してから、次を使用しますrand()

unsigned int seed = 10;  /* Choose an arbitrary value for the seed */
int r;

srand(seed);             /* Set the seed                           */
r = rand();              /* Generate a random number               */

マニュアルページには、疑似乱数のシーケンスが繰り返し可能である可能性があることが明示的に記載されています(したがって、決定論的です)。

このsrand()関数は、引数を、によって返される疑似乱数整数の新しいシーケンスのシードとして設定しますrand()これらのシーケンスは、同じシード値で呼び出すことで繰り返すことができます。srand()


編集(説明):
マニュアルページには、srand()再入可能でもスレッドセーフでもないと記載されていることに注意してください。「異なるゲームインスタンス
」 とは、異なるプロセスを意味すると思いました。その場合は、それを使用しても問題ありません。 ただし、同じプロセス内でシードを変更することを計画している場合は、必要な機能を取得できません。この場合、代わりに使用することをお勧めします。参考までにこの質問を見てください。
rand_r()

于 2012-07-08T08:46:24.887 に答える
3

「コンテキスト」(それが意味するものは何でも)は必要ないようです。代わりに、現在の状態を保存および復元できるPRNG実装を探しています。これは、自分で実装するPRNG実装で実際に可能です(常に状態を保存できるため)が、ライブラリ関数では状態へのアクセスが許可される場合とされない場合があります。

LinuxとMacOSの場合、実際にはrandに加えてrand_rが追加されました。これはスレッドセーフで再入可能なバージョンのrandとして文書化されていますが、その背後にある「魔法」は、保持するのではなく、現在の状態へのポインターを取得することです。静的変数にあります。drand48ファミリのような他の乱数関数にも、追加のパラメータを備えたバージョンがあるようですが、状態を格納するために使用できるかどうかを確認するために、さらに読み取る必要があります。

いずれにせよ、乱数ジェネレーターの「google」または「wikipedia」で自分自身を実装する場合、「現在の状態」を明示的なパラメーターにするのは簡単です。

于 2012-07-08T08:51:37.573 に答える
2

とを使用できる場合がrandom()ありsetstate()ます。私はsetstate()自分自身を使用していませんが、マンページはそれがあなたが望むことをするかもしれないことを示しているようです…</ p>

于 2012-07-08T08:46:16.553 に答える
2

使用する「明らかな」PRNGは、drand48()関数のファミリーです。これらにより、48ビットの状態を提供でき、計算で使用される乗数と定数を設定することもできます。

于 2012-07-08T09:11:51.027 に答える
2

優れたPRNGライブラリであれば、これを実行できるはずです。 GNU Scientific Libraryは、多くの異なるアルゴリズムを介して、および多くの確率分布から乱数を生成するためのサポートを提供します。を呼び出すたびgsl_rng_allocに、独自の状態を持つ独立した乱数ジェネレーターがセットアップされます。これは、を使用してシードできますgsl_rng_set。プログラムのさまざまな部分にさまざまなシードを使用することをお勧めします。使用するPRNGアルゴリズムによっては、特定のシードがうまく機能しない場合があります。random.orgからいくつかの数字をコピーして貼り付けることは、おそらくシードを取得するための良い方法です。

于 2012-07-08T09:29:49.770 に答える