5

私はCで働いており、ジェネレーターを実行するたびに異なる数を生成するだけでなく、プログラムを実行するたびに異なるシーケンスも生成するランダムジェネレーターを(必死に)作成しようとしています.オンラインで見つけたほとんどすべてをテストしました.I良い乱数発生器を作るための 2 つの良い方法が得られました。最初のものは毎回異なるシードを使用することですが、これは毎回異なるランダムシードを使用する必要があることを意味し、最初は解決できませんでした。私が望むようにランダム:

int myrand(int random_seed){
  random_seed = random_seed * 1103515245 +12345;   
  return (unsigned int)(random_seed / 65536) % 32768; 
                           }

関数を呼び出すたびに、シードを 1 増やします。

2 番目の方法は時間を使用することです。時間は変化し、これはランダム性です。私もこれを実装するために多くの方法を試しました。私の最新の試みは次のとおりです: Compiler error-Possible IDE error"undefined reference to gettimeofday error" but I could not gettimeofday 関数は、私が Windows で作業しているためです。また、その質問でも回答が得られませんでした。

Windowsで動作するCで(おそらく時間を使用して)ランダムジェネレーターを実装する方法を誰か助けてもらえますか?それともUnixを使用する必要がありますか?

4

6 に答える 6

4

RNG に適切なエントロピー ソースをシードします。

UNIX では、/dev/random を使用します。

Windows では、CryptoAPI のようなものを使用します - Windows では /dev/random に相当します

于 2012-12-18T17:42:57.380 に答える
3

あなたが求めているのは乱数ジェネレーターではなく、C 標準ライブラリに既に含まれている乱数ジェネレーターの使用方法です。

あなたがする必要があるのは、プログラムの起動時に一度シードするだけです:

srand(time(NULL));

それで全部です。移植性があり、最後に実行してから少なくとも 1 秒経過していれば、プログラムを実行するたびに異なるシーケンスが得られます。

後で再度シードしても害はありませんが、意味もありません。

于 2012-12-18T17:44:12.970 に答える
1

C 標準ライブラリには、ヘッダー time.h (C++ を使用している場合は ctime) (参照) があります。そこにある機能は、Windows と Unix でサポートされます。

乱数ジェネレーターのシードとして time() または clock() をお勧めします。

完全にランダムな入力を取得する別の方法は、マウスの位置や外部から影響を受けるその他のものを使用することです。

于 2012-12-18T17:49:39.740 に答える
0

Windows ソリューションを明示的に求めているので、粒度が非常に限られているため (ミリ秒) 、回避するtime(NULL)clock()、シードとして使用することをお勧めします。srand()代わりに、パフォーマンス カウンターの結果を使用できます。

LARGE_INTEGER PerformanceCount;
QueryPerformanceCounter(&PerformanceCount);
srand(PerformanceCount.LowPart);

QueryPerformanceCounter()の頻度の増加率は、 QueryPerformanceFrequency( )を呼び出すことで取得できます。これは通常、少なくとも 1 MHz 増加し、場合によっては GHz 範囲まで増加します。したがって、シードの急速に変化するソースを提供します。

編集:以前の質問から理解されるように、gettimeofday()同様の実装でも細かい粒度は得られません。引数に単語が表示される場合がtv_usecありますが、Windows では、Linux システムのようにマイクロ秒単位の粒度は提供されません。

于 2012-12-19T10:18:03.537 に答える
0

見積もり:

to make a random generator that not only generates a different number every time i run the generator

ランダムの定義には、その概念は含まれていません。むしろ、以前に選択した数に関係なく、任意の数を選択する可能性が等しいという考えです。つまり、理論上、同じ数字を 2 回選択することは可能です。

カードのデッキを配っている場合、それは重複しないという基準を満たしています。デッキ ディール アプローチを使用するということは、「使用された」数字を追跡することを意味します。

また、PNRG (疑似乱数ジェネレーター) は周期的 (周期的) であることにも注意してください。数字 (通常は大きな数字) を生成した後、最初からやり直して、数字の名前シーケンスを正確に繰り返します。UNIXrand()関数は、[0, {RAND_MAX}] の範囲の整数を生成し、周期は 2^32 です。

この短いページを読むことを本当に検討してください:

参照: http://pubs.opengroup.org/onlinepubs/009695399/functions/rand.html

于 2012-12-19T12:54:30.593 に答える
0

prng を実装するには多くの方法がありますが、残念ながら実際の乱数ジェネレーターはありません。time(NULL) は良いアプローチですが、「blum blum shub」を使用しています。1ビットの乱数を生成します

于 2012-12-18T18:41:03.423 に答える