知りたいのですが、どのように確率をJavaに実装しますか?たとえば、変数が表示される可能性が1/25の場合、どのように実装しますか?または他の確率?一般的な方向を教えてください。
Random を使用して乱数を生成し、それをリテラルに対してテストして、達成しようとしている確率と一致させます。
与えられた:
_boolean val = new Random().nextInt(25)==0;
_
val
は1/25の確率で真になります(nextInt()
は0から25までの任意の数を返す確率が偶数であるため)。
もちろん、_import Java.util.Random;
_も必要です。
以下で指摘したように、複数の乱数を取得する場合は、Randomオブジェクトを常に再作成するよりも再利用する方が効率的です。
_Random Rand = new Random();
boolean val = Rand.nextInt(25)==0;
_
..
_boolean val2 = Rand.nextInt(25)==0;
_
通常、乱数ジェネレーターを使用します。これらのほとんどは、間隔[0,1]で数値を返すため、その数値が0.04以下であるかどうかを確認します。
if( new Random().nextDouble() <= 0.04 ) { //you might want to cache the Random instance
//we hit the 1/25 ( 4% ) case.
}
または
if( Math.random() <= 0.04 ) {
//we hit the 1/25 ( 4% ) case.
}
異なるプロパティを持つ複数の乱数ジェネレーターがありますが、単純なアプリケーションではRandom
クラスで十分であることに注意してください。
Javaには Java.util.Random
乱数を生成できます。確率1/25で何かを発生させたい場合は、1〜25(または0〜24)の乱数を生成し、その数値が1に等しいかどうかを確認します。
if(new Java.util.Random().nextInt(25)==0){
//Do something.
}
1.7以降では(少なくとも並行環境で)使用することをお勧めします。
ThreadLocalRandom.current().nextInt(25) == 0
現在のスレッドに分離された乱数ジェネレーター。 Mathクラスで使用されるグローバルランダムジェネレーターと同様に、ThreadLocalRandomは内部で生成されたシードで初期化されます。該当する場合、並行プログラムで共有RandomオブジェクトではなくThreadLocalRandomを使用すると、通常、オーバーヘッドと競合がはるかに少なくなります。 ThreadLocalRandomの使用は、複数のタスク(各ForkJoinTaskなど)がスレッドプールで乱数を並列に使用する場合に特に適しています。このクラスの使用法は通常、ThreadLocalRandom.current()。nextX(...)(XはInt、Longなど)の形式である必要があります。すべての使用法がこの形式の場合、誤ってThreadLocalRandomを複数のスレッド間で共有することはできません。
このクラスは、一般的に使用される追加の有界ランダム生成メソッドも提供します。
たぶん、乱数を生成してこれを実装できます。
Random rn = new Random();
double d = rn.nextDouble(); // random value in range 0.0 - 1.0
if(d<=0.04){
doSomeThing();
}