0

この質問は簡単なものです:)。srand()同じシーケンスの乱数が生成されるのを防ぐために、乱数ジェネレーターをシードするために使用されることを知っています。getpid()同様に、 「呼び出したプロセスのプロセス ID を返さなければならない」ということも知っています。

( http://pubs.opengroup.org/onlinepubs/009695399/functions/getpid.html )

私のプログラム (プロデューサーとコンシューマーが共有メモリを介して通信するプログラム) を実行するたびにプロセス ID が最終的に異なるため、PID も異なり、完全なシードが得られます。乱数の範囲を設定しましたrand() % (100-1) + 1

srand(getpid())乱数は特定の形式で配信されますか?

完全を期すために、私の問い合わせに関連するコードのセクションを次に示します。

srand(getpid());

while(x == 0)
{      
        if(*randNum == 101)
        {      
                *randNum = rand() % (100 - 1) + 1;
                *pidNum = getpid();

                printf("priority: %d Process ID: %d \n", *randNum, *pidNum);

                x = 1;
        }   
        else
        {      
                *randNum++;
                *pidNum++;
        }   
}   
4

2 に答える 2

3

特定の形式が何を意味するのか正確にはわかりません。しかし、getpid() はシードとして適切な選択ではありません。PID は「符号なし」スペースのかなり狭い範囲にあり、簡単に推測できます。

人々があなたのシードを推測できることを気にしない場合は、シードとして time(NULL) を選択することをお勧めします。

于 2013-07-29T14:50:51.817 に答える
0

確かに、実行中の 2 つのプロセスが同じ PID を持つことはありませんが、新しいプロセスが終了したばかりのプロセスと同じ PID を取得しないという保証はありません。通常、PID は常に増加しますが、遅かれ早かれオーバーフローし (たとえば、Linux ではデフォルトで最大 PID は 32'768)、以前に使用されていた PID がリサイクルされます (システムによっては、それよりも早くリサイクルされることもあります。さまざまな種類のプロセス用に PID 範囲が予約されているなど)。

次の問題はrand、多くのシステムで乱数発生器が非常に悪いことです (Linux は例外かもしれませんが、タグは「UNIX」と表示されます)。BSD のマニュアル ページにも、その文学的な記述があります (MacOS X を含む BSD のほとんどの子孫に当てはまります)。非 POSIX コードとの互換性のためにのみ存在します。最新のコードはすべてrandom代わりに使用します。これは、ほとんどのシステムではるかに優れた乱数ジェネレーターです (また、他のシステムでは よりも悪くrand()ないため、使用しても失うものはありません)。rand()「弱い」実装のシステムではコードが実行されないことを常に確実に判断できる場合を除き、 を使用するrandomのが安全な方法です。

srandomdev()ほとんどのシステムは、POSIX 標準の一部ではないcall をサポートしていますが、現在ではほぼすべてのシステムで利用できます。これrandomは、システム カーネルの乱数発生器からデータを読み取ることによって初期化されます (多くのシステムでは、 から利用できます/dev/random)。この乱数ジェネレーターは非常に優れた乱数を生成し、システム ハードウェアによっては、「実際の乱数」を生成することさえできます。たとえば、多くの最新の CPU と一部のメインボード チップには、ある種の「ランダムな電気ノイズ」から乱数を生成できるハードウェア乱数ジェネレータがあり、これはほぼ完全にランダムです。そのようなハードウェアが利用可能で、カーネルがサポートしている場合は、乱数を生成するためのものです。

于 2013-07-29T15:13:23.770 に答える