奇妙なタイトルにもかかわらず、私は正当な質問をしたいと思います: Java のクラスまたは C++ のどちらのメソッドの生成された数値がよりランダムですか?Random()
Math.random()
rand()
PHP は非常に悪いと聞いたことrand()
があります。つまり、その結果をマッピングすると、パターンがはっきりとわかります。残念ながら、C++ や Java でマップを描画する方法がわかりません。
また、興味深いことに、C# はどうでしょうか。
Java と C++ はどちらも、次のいずれかの疑似乱数を生成します。
正直なところ、これらのクラスのいずれかに属していない限り、疑似乱数ジェネレーターは問題ありません。
JavaにはSecureRandom
、暗号クラスの非決定性を提供するという趣旨もあり(その議論の真実性についてコメントすることはできません)、C++には現在、単なる乱数生成機能よりもはるかに多様な乱数生成機能がありますrand()
-詳細<random>
については参照してください。
CryptGenRandom
特定のオペレーティング システムでは、Windows や/dev/random
Linux での読み取りなど、乱数ジェネレーターにエントロピーのソースが提供される場合があります。または、ユーザー入力タイミングなどのランダムなイベントを使用してエントロピーを追加することもできます。
(a)実際には、統計学者でも暗号学者でもない他の職種の痕跡が含まれている可能性があります :-)
java.util.Random
( によって内部的に使用されMath.random()
ます)は、かなり弱い RNG であるLinear congruential generatorを使用しますが、単純なことには十分です。重要なアプリケーションでは、java.security.SecureRandom
代わりに使用する必要があります。
C または C++ 言語の仕様でアルゴリズムの使用が禁止されているとは思いませんrand()
が、ほとんどの実装では LCG も使用されます。C++11 では、より高品質のランダム性を実現する新しい API が追加されました。
PHP はシードを使用します。シードが 2 つの異なる時点で同じである場合、rand() 関数は常に同じものを出力します。(これは、たとえばトークンにとっては非常に悪い場合があります)。C++ と Java についてはわかりませんが、真のランダム性がないため、品質の評価が難しくなっています。セキュリティは、そのような機能に依存してはなりません。