Javaは、ThreadLocalRandom、のSecureRandom、乱数に馬をランダムに生成します

あなたは3クラスの詳細情報が必要な場合、あなたはJAVAを表示することができ、これらのタイプの私たちの共通のを実際には、乱数を生成するが、多くの方法があります;ランダム、ThreadLocalRandom、のSecureRandom:私たちは、Javaがいくつかの方法で乱数を生成する一般的であると言いますAPI。

=新規新しいランダムランダムランダム();
int型にRandom.nextInt A =(5); // 0 4ランダムに生成されたデジタル中間に
ランダムコンストラクタは、彼が長いタイプのパラメータの値を渡すことができ、実際、空のとき施工時間は、使用することは、(実際にSystem.nanoTimeのです)私たちは、この種子を呼んで、ミリ秒単位で現在の時刻の値です。

種子はそれをやっている、私たちは、乱数を生成、実際に擬似乱数ですが、我々は、乱数生成より高い強度を作りたい、私たちはより良いアルゴリズムと種を必要とします。一般的には、直接に乱数、空のコンストラクタを生成するランダムを使用します。それは、実際には、読者をテストするために記載されたものを使用最終的に種子がこのランダム、そしてこのように、乱数を生成するために行く私たちは、このような1として、一定の乱数を使用して、我々は新しい時代に行くことを知って、あなたは意志私たちは、結果は同じ番号3であることがわかりました。

/**
 * -1157793070
 * 1913984760
 * 1107254586
 */
@Test
public void test2(){
    Random random = new Random(10); 
    for (int i = 0; i < 3; i++){
        System.out.println(random.nextInt());
    }
}

したがって、我々はミリ秒数を、現在の時刻をシードコーディングを入れてはいけない、それはかなり良いです。また、ランダムの使用は、新しいオブジェクトを繰り返さないようにしてみてください、それはあまりにも重要ではありません。、というランダムのスレッドセーフ、あなたは公式文書を参照することができ、ここに行くと結論付け、「java.util.Randomののインスタンスはスレッドセーフです。」。しかし、マルチスレッドパフォーマンスで、そして彼のパフォーマンスが悪いです。

JavaのAPIヘルプドキュメントでは、ランダムの説明をまとめました。

クラスで実装java.util.Randomのランダムアルゴリズムは、擬似ランダム、ランダムルール、いわゆる正規番号をランダム種(シード)の所定の範囲内で生成され、
同じ種のオブジェクトのランダムな番号、同数生成された乱数は同じです。

各クラスランダム用の乱数を生成する方法は、均一、等化部の内部で生成された確率の数を分散しています。

このクラスは、Java7新しいクラスには、使用する乱数を生成するために、マルチスレッドです。CASの使用は(比較とセット)乱数を生成するときに、しかしThreadLocalRandomを使用していなかったので、なぜThreadLocalRandomそれが速くランダムよりも、ランダムです。

以下は、乱数java.util.Randomののを生成する方法です。

次INT(INTビット){保護
長いオールドシード、nextseed。
AtomicLongシード= this.seed。
実行{
オールドシード= seed.get()。
nextseed =(オールドシード*乗算+加算)&マスク。
}一方(seed.compareAndSet(オールドシード、nextseed)!)。
リターン(INT)(nextseed >>>(48 -ビット))。
}
而这边的シード是一个全局变量。

/ **

  • この擬似乱数生成器に関連付けられた内部状態。
  • (このクラスのメソッドの仕様は、進行中の説明します
  • 計算のこの値)。
    * /
    民間最終AtomicLong SEED、
    同時に複数のスレッドが乱数を取得するには、同じシードのために競合することになる、効率は低下しました。

CASを介して目に見える、その保証スレッドの安全性。スレッド間の競争によるこの高度の並行環境では、必然的にいくつかのパフォーマンスの損失をもたらすでしょう。

この時点で、乱数発生のための改良されたツールを使用してThreadLocalのThreadLocalRandom、便利にThreadLocalで来る、各個々のスレッドは完全にスレッド間の競合を解消ThreadLocalRandomオブジェクト参照を保持します。

特定の比較ThreadLocalRandomのさらなる例は、以下の簡単な例を見て。

ThreadLocalRandom = ThreadLocalRandom.current ThreadLocalRandom();
int型A = threadLocalRandom.nextInt(5)
それが結合して糸ので、彼はまた、現在のスレッドから取得されるからです。

あなたが頻繁に乱数を生成する、または高いセキュリティ要件する必要がある場合は、ランダムを使用していない、これはよく私たちがご紹介し始めてから右に理解されている知ることができ、ランダム値が実際に予測可能である生成されました。

内蔵の乱数アルゴリズム、NativePRNGとSHA1PRNGの二種類は、メソッドの例を参照してください。新によって初期化、デフォルトでは、乱数を生成するNativePRNGアルゴリズムを使用しますが、また、アルゴリズムのパラメータ-Djava.securityコールを変更するように構成することができます。それは、2つのは/ dev / [U]ランダムなものであればそうでない場合、SHA1PRNG NativePRNGあります。

さらに、JVMの起動パラメータなどのような、-Djava.security =ファイル:は/ dev / urandomが。

二つの追加のパラメータは、2番目のパラメータはまた、アルゴリズムのパッケージを指定することも、もちろん、あなたものgetInstanceオブジェクトによって初期化することができるが、アルゴリズムの名前は、直接があれば何のアルゴリズムは例外なく、ライン上に送信され、一つのパラメータを持っています。実装コードで見てみましょう。

SecureRandom =新しい新しいのSecureRandomのSecureRandom();
のSecureRandom secureRandom3 = SecureRandom.getInstance( "SHA1PRNG");
のSecureRandom secureRandom2 = SecureRandom.getInstance( "SHA1PRNG"、 "SUN");
もちろん、私たちは乱数を生成するには、このクラスを使用する場合、のみなど乱数を生成する必要性は、インスタンスなどのたびに生成されるたびに、オブジェクトを再生成する必要はありませんでした。条件は()を開始するための最良のサービスを許可した場合に加えて、このクラスは、乱数、比較的貧弱なパフォーマンスを最初に呼び出し、nextIntについての最初の呼び出しを生成します。

また、パフォーマンスは、実際に、より良いNativePRNG SHA1PRNGよりほぼ倍増パフォーマンスが良い、半分以下の同期コードでされているので、安全性に特別な重点がありません

乱数を生成するためにSHA1PRNGアルゴリズムを利用する全体の必要性。

これは、0と1の間でデフォルト小数によって生成された乱数を生成する一般的に使用される方法です。

要約:

1、それほど厳しい安全スタンドアロンの場合、ランダムを使用する場合は、高いセキュリティ要件、のSecureRandomを使用します。

SecureRandomの2つのアルゴリズム、SHA1PRNGとNativePRNG、SHA1PRNG良い性能が、安全性のNativePRNGがあります。

2、ランダムスレッドセーフ、CASを維持するためには、より高いパフォーマンスよりも、その複数のスレッドは、Java並行処理袋ThreadLocalRandomの使用をしないように、

スレッド間の競合によるパフォーマンスの問題を回避するために、

おすすめ

転載: blog.51cto.com/14477123/2471814