8

奇妙なタイトルにもかかわらず、私は正当な質問をしたいと思います: Java のクラスまたは C++ のどちらのメソッドの生成された数値がよりランダムですか?Random()Math.random()rand()

PHP は非常に悪いと聞いたことrand()があります。つまり、その結果をマッピングすると、パターンがはっきりとわかります。残念ながら、C++ や Java でマップを描画する方法がわかりません。

また、興味深いことに、C# はどうでしょうか。

4

5 に答える 5

9

Java と C++ はどちらも、次のいずれかの疑似乱数を生成します。

  • 統計学者または暗号学者ではない人のタスクに適しています(a) ; また
  • これらの2つのクラスの人々にはひどく不十分です。

正直なところ、これらのクラスのいずれかに属していない限り疑似乱数ジェネレーターは問題ありません。

JavaにはSecureRandom、暗号クラスの非決定性を提供するという趣旨もあり(その議論の真実性についてコメントすることはできません)、C++には現在、単なる乱数生成機能よりもはるかに多様な乱数生成機能がありますrand()-詳細<random>については参照してください。

CryptGenRandom特定のオペレーティング システムでは、Windows や/dev/randomLinux での読み取りなど、乱数ジェネレーターにエントロピーのソースが提供される場合があります。または、ユーザー入力タイミングなどのランダムなイベントを使用してエントロピーを追加することもできます。


(a)実際には、統計学者でも暗号学者でもない他の職種の痕跡が含まれている可能性があります :-)

于 2013-02-04T08:15:44.433 に答える
5

java.util.Random( によって内部的に使用されMath.random()ます)は、かなり弱い RNG であるLinear congruential generatorを使用しますが、単純なことには十分です。重要なアプリケーションでは、java.security.SecureRandom代わりに使用する必要があります。

C または C++ 言語の仕様でアルゴリズムの使用が禁止されているとは思いませんrand()が、ほとんどの実装では LCG も使用されます。C++11 では、より高品質のランダム性を実現する新しい API が追加されました。

于 2013-02-04T08:19:09.360 に答える
0

PHP はシードを使用します。シードが 2 つの異なる時点で同じである場合、rand() 関数は常に同じものを出力します。(これは、たとえばトークンにとっては非常に悪い場合があります)。C++ と Java についてはわかりませんが、真のランダム性がないため、品質の評価が難しくなっています。セキュリティは、そのような機能に依存してはなりません。

于 2013-02-04T08:15:24.387 に答える