Random クラスを使用する乱数は、int をビット マングルして新しい int を生成するアルゴリズムを使用します。呼び出しの速さや回数に関係なく、同じアルゴリズムが使用されます。進行は進行です。
これをテストするには、42 などの数値をシードします。その後、進行状況を監視します。同じ番号でもう一度シードします。まったく同じ進行。
このアプローチの欠点は、数値が完全にランダムではないことです。それらはかなりランダムで、ほとんどの場合には十分ですが、完全にランダムではありません。
Random メソッドの出力を、非常に厳しい一連のテストで実行しました。1 つは境界線で、もう 1 つはまったく失敗しました。それが、私たちが話しているランダムの一種です。
さらに、日時スタンプを使用して自身をシードするため、状況によってはある程度予測可能です。毎週月曜日の朝一番にその週のタスクを起動して実行する人を想像してみてください。月曜日の朝の 8 時から 8 時 30 分までのタイムスタンプで実行されるため、ある程度の予測可能性があります。
そのため、セキュリティに関係のないほとんどの操作には Random で十分です。それらの多くでさえ。
一方、SecureRandom は真の乱数を生成します。これは、システムのタイミングや、無数の要因に基づいて秒単位で変化するその他の事柄を調べることによって行われます。
欠点は、これらの要因は 1 秒間に頻繁にしか変化しないため、SecureRandom は一定期間内に有限数の乱数しか生成できないことです。事前に生成して使用するためにキャッシュしようとしますが、キャッシュを吹き飛ばすことができます。
このように、私の逆浸透浄水器のようなものです。すでにろ過された1ガロンの水を保持します。1 ガロンの水を 1 回のショットで使用すると、フィルターでろ過された速度で水が得られます。たとえば、5 秒あたり 1 オンスなどです。最初のガロンは速く、その後は非常に遅くなります。