11

このトピックについては、矛盾する情報がたくさんあります。それでは、決定的な答えに同意してみましょう。

Cのこれらの乱数ジェネレーターのどれがより良いランダム性を作成しますか:rand、randomまたはarc4random?

注:質問を明確にするために、これは真のランダム性に関する質問ではなく、これら3つの間の衝突にすぎません。


指摘したように、これはCに関するものではなく、特定の実装、私の場合はcocoa(より具体的には、iphone sdkですが、これらに関しては同じであると思います)に関するものであるため、この質問はあまり意味がありません。関数が移動します)。それでも、ここにはいくつかの有用な情報があります。私はarc4randomを実装することで結論を下しました。これは主に、その使いやすさ(シードは不要)のためです。これは、誰も指摘しなかった重要な要素です。

質問を締めくくり、RNGに関する情報を探しているカカオ開発者のためにカカオタグを追加します。貢献してくれた人たちに感謝し、混乱してすみません。

4

2 に答える 2

24

これらの関数のうち、randのみが標準Cの一部です。randomはPOSIXの一部であり、arc4randomはBSD(および派生)でのみ提供されます。したがって、ランドのみが「C言語」になります。

ランドの場合、C標準はジェネレーターの品質について何も述べていません。つまり、常に同じ数を返すことは適合します。これは、数値が0からRAND_MAXの間でなければならないことを示しています。RAND_MAXの値、および使用されている正確なアルゴリズムは、実装によって定義されます(ただし、RAND_MAXは少なくとも32767である必要があります)。

ランダムの場合、POSIXは、デフォルトで少なくとも2 ^ 31の期間が必要であると指定し、initstateが256バイトの状態で呼び出される場合、少なくとも2^69の期間が必要です。その他の詳細も実装で定義されています。

arc4randomの場合、特定の実装はその定義(RC4)の一部です。2^32の異なる値を与えるように指定されています。その期間については何も見つかりませんでした。

それらを詳細に比較するには、参照している特定の実装を知る必要があります。

于 2008-11-30T15:38:01.610 に答える
9

rand()の実装はC標準で指定されていませんが、ほとんどのコンパイラは線形合同法を使用しています。random()とarc4random()も標準Cではありませんが、rand()の通常の実装よりも優れています。

私は言います:arc4random()はrandom()よりも優れていますrand()よりも優れています

rand()は本当にひどいです。ただし、3つすべてよりも簡単にうまくいく可能性があります。

また、乱数の目的によっても異なります。暗号化/セキュリティに適した乱数ジェネレータは、シミュレーションに適した乱数ジェネレータではない場合があります。その逆も同様です。

于 2008-11-30T15:29:18.103 に答える