5

重複の可能性:
乱数を効果的に生成する

アプリケーションで生成する必要がありrandom numbersますC++。私はこれらの2つの記事を読んで知っています-

http://www.cprogramming.com/tutorial/random.html

特定の範囲で1つの乱数、1組の乱数、または3つの乱数を生成するac関数を記述します。

--その乱数はを使用して生成できますsrand()rand()、どちらの場合も、に従って現在の時刻system clockがとして使用されますseedrand()しかし、シードが同じである場合に同じ乱数を作成する最初の記事を読みました。したがって、2人の異なるユーザーが同時に私のアプリケーションを実行した場合、それらは同じ乱数を持ちます。ほとんどの場合、乱数は一意である必要があるため、これは無意味です。(ランダムに生成された場合、それらが本当に100%一意になることはありません)

だから私の質問は、システム時間に基づいていないランダムシードを作成できますか?もしそうなら、なぜrand()同じシードで同じ数を生成するのですか?同じシードでrand()異なる数を生成する方法はありますか、または他にありますか乱数を生成する方法は?

4

4 に答える 4

8

特別なハードウェアを使用しなければ (その場合でも議論の余地があります)、コンピューターによって生成される真の乱数などは存在しません。

そうは言っても; 唯一の問題は、2 つのプログラムが同じ数を生成しないようにシードを生成する方法です。シードの一部として現在の時刻を使用することは合理的ですが、2 つのプログラムが同時にシードを生成する可能性があるため、それだけでは十分ではありません。プログラム。可能性としては、プロセス ID (両方のプログラムが同じコンピューター上にある場合は異なります)、ハードウェア MAC アドレス (両方のプログラムが異なるコンピューター上にある場合は異なります)、またはユーザーが何らかのタスクを実行するのにかかる時間のタイミング (一般的にはユーザーが自動化ではなく人間である限り異なります)。

于 2012-09-30T16:24:00.380 に答える
3

正確な要件に応じて、ソリューションは次のように単純になる場合があります。

struct timeval;
gettimeofday(&time, NULL);
srand(hash3(time.tv_sec, time.tv_usec, getpid()));

次のような任意の 3 つの整数ハッシュ関数を使用できます。

unsigned int hash3(unsigned int h1, unsigned int h2, unsigned int h3)
{
    return ((h1 * 2654435789U) + h2) * 2654435789U) + h3;
}
于 2012-09-30T16:27:08.183 に答える
2

他の回答に加えて、Linux (および他の一部の Unix) システムでは、/dev/randomまたは/dev/urandom疑似デバイスから数バイトを読み取ることができます (少なくとも PNRG をシードするため)。random(4)の man ページも注意深く読んでください (/dev/randomとの重要な違いについても説明しています/dev/urandom) 。

最新のC++2011<random>標準 (以前のものではない) に合わせてコーディングする場合は、そのヘッダーに興味があるかもしれません。次に、最新のGCCコンパイラ (4.7 など) とlibstdc++ライブラリを使用します。

于 2012-09-30T16:28:57.203 に答える
0

真の乱数ジェネレーターを実装することはできませんが、役立つ可能性のある多くの優れた疑似乱数関数の実装があります。

  1. Boost.Random: http://www.boost.org/doc/libs/1_51_0/doc/html/boost_random.html
  2. C++11<random>ヘッダー ファイル: http://www.cplusplus.com/reference/std/random/
  3. 関数を含むC<stdlib.h>ヘッダー ファイル: http://www.cplusplus.com/reference/clibrary/cstdlib/rand/rand()
于 2012-09-30T16:33:56.750 に答える