本から何を学びますか?
最も明白で直感的な方法は、簡単な呼び出しでJavaで乱数を生成することです。
java.lang.math.random()
他のすべての言語では、乱数を生成することは、ABS、POW、床、SQRT、その他の数学機能などの数学ツールクラスを使用するようなものです。ほとんどの人は、本、チュートリアル、コースを通じてこのカテゴリについて学びます。簡単な例:0.0から1.0の二重精度の浮動小数点数を生成できます。次に、上記の情報を通じて、開発者は0.0〜10.0の間のダブルエシジョンフローティングポイント数を生成し、次のように書きたいと考えています。
Math.random() * 10
0〜10の整数が生成された場合、次のように記述されます。
math.round(math.random() * 10)
高度な
Math.random()のソースコードを読み取るか、IDEの自動完了関数を使用するだけで、開発者はjava.lang.math.random()が内部ランダムに生成されたオブジェクトを使用することを簡単に見つけることができます - 非常に強力なオブジェクトは柔軟なランダムにすることができます生成:ブール値、すべての数値タイプ、さらにはガウス分布。例えば:
new Java.util.random()。nextint(10)
それは不利な点があります、つまり、それはオブジェクトです。その方法はインスタンスを通じて呼び出される必要があります。つまり、コンストラクターは最初に呼び出されなければなりません。十分なメモリがある場合、上記のような表現は受け入れられますが、メモリが不十分な場合、問題を引き起こします。
乱数が静的クラスを使用するたびに新しいインスタンスの作成を避けることができる簡単なソリューション。 java.lang.mathを考えたことがあるかもしれません。非常に良いです、java.lang.mathの初期化を改善しています。このプロジェクトは低いですが、それが間違っていないことを確認するために、いくつかの簡単なユニットテストを行う必要もあります。
プログラムが保存するために乱数を生成する必要があると仮定すると、問題は再び発生します。たとえば、種子を操作または保護する必要がある場合があり、内部数を使用して状態を保存して次の乱数を計算するために使用されます。これらの特別な場合、ランダムに生成されたオブジェクトを共有することは不適切です。
同時
Java EEマルチスレッドアプリケーションの環境では、ランダムに生成されたインスタンスオブジェクトは、静的プロパティとしてクラスまたはその他の実装クラスに保存できます。幸いなことに、java.util.randomはスレッドセーフであるため、複数のスレッド呼び出しが種子を破壊するリスクはありません。
検討する価値のあるもう1つのことは、Java.lang.ThreadLocalのマルチスレッドインスタンスです。怠zyなアプローチは、もちろん、Java自体APIを介して単一のインスタンスを実装することです。
JavaはJava.util.randomの単一インスタンスを管理する良い方法を提供していません。ただし、待望のJava 7は、乱数を生成する新しい方法を提供します。
java.util.concurrent.threadlocalrandom.current()。nextint(10)
この新しいAPIは、他の2つのアプローチの利点を組み合わせています。単一インスタンス/静的アクセス、Math.random()と同じくらい柔軟です。 ThreadLocalrandomは、高い並行性を処理する他のどの方法よりも高速です。
経験
クリス・マラスト・ジョージは指摘します:
math.round(math.random() * 10)
分布を不均衡にします。たとえば、0.0-0.499999は0に丸め、0.5〜1.4999999は1に丸くなります。次のように、古いスタイルの構文を使用して正しいバランスの分配を実現する方法:
math.floor(math.random() * 11)
幸いなことに、java.util.randomまたはjava.util.concurrent.threadlocalrandomを使用している場合、上記について心配する必要はありません。
Java Practicalプロジェクトは、java.util.random APIを使用して誤って誤って害を及ぼします。このレッスンは、使用しないことを示しています。
math.abs(rnd.nextint())%n
そして使用:
rnd.nextint(n)
上記は、Javaのn乱数の関連する紹介であり、すべての人の学習に役立つことを願っています。