2011-11-18 10 views
28

私は好奇心が強いです、Javaで確率をどのように実装するのですか?たとえば、変数の表示の確率が1/25の場合、どのように実装するのですか?または他の確率?一般的な方向で私を指摘してください。Javaでの確率

+3

チェックアウトJavaランダムクラス。それはあなたが乱数を生成することができ、そこから行くことができます... –

答えて

53

乱数を生成するにはRandomを使用し、達成しようとしている確率と一致するリテラルに対してテストします。

だから、与えられた:

boolean val = new Random().nextInt(25)==0; 

valnextInt()は0で、最大に始まる任意の数を返すも、確率を持っていますが、含めないことから、25)、真であることの1/25の確率を持っています

もちろん、import java.util.Random;にする必要があります。

としては、あなたがそれをすべての時間作り直すのではなく、ランダムなオブジェクトを再利用する方が効率的だろうつ以上の乱数を取得している場合、下記の指摘..

Random rand = new Random(); 
boolean val = rand.nextInt(25)==0; 

boolean val2 = rand.nextInt(25)==0; 
+1

偉大な論理!ありがとうございました! –

+1

+1:新しいRandom()をフィールドまたは変数に配置し、それを再利用すると効率が向上します。 –

+0

@PeterLawreyあなたはもちろん正しいです、私は適切に答えを編集しました。私はちょうど1行の例としてそれを置く! – berry120

25

通常、乱数ジェネレータを使用します。それらのほとんどは[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クラスが十分でなければならないこと。

+0

一般的なケースでは、rand.nextDouble()を使用するこの解は、与えられた整数xに対して1/xにではなく任意の確率に適用できるので、受け入れられた解より優れています。 たとえば、ターゲット確率が33.5%の場合、rand.nextInt()を使用する単純でクリーンなソリューションはありません。 – shiri

+1

@shiriの可能性があります。整数を使用すると、0から1000までの整数を作成し、値が335未満であることを確認できます。 – Thomas

+1

が合意しました。私が確率を考えるとき、私は[0,1]の範囲の数値で考える傾向があるので、私はnextDouble()<= Xがよりきれいであることがわかります。 – shiri

5

Javaには、乱数を生成するjava.util.Randomというクラスがあります。あなたは確率1/25で発生するために何かをしたい場合は、単に1および25(または0と24を含む)の間の乱数を生成し、その数は1

if(new java.util.Random().nextInt(25)==0){ 
    //Do something. 
} 
2

たぶん、あなたはこれを実装することができますに等しいかどうかを確認してください乱数を生成します。

Random rn = new Random(); 
    double d = rn.nextDouble();  // random value in range 0.0 - 1.0 
    if(d<=0.04){ 
    doSomeThing(); 
    } 
6

は1.7以降では、(少なくとも同時環境で)使用することをお勧めします:現在のスレッドに分離

ThreadLocalRandom.current().nextInt(25) == 0 

Javadoc

乱数ジェネレータ。 Mathクラスで使用されるグローバルRandomジェネレータと同様に、ThreadLocalRandomは内部的に生成されたシードで初期化されます。適用可能な場合、並行プログラムで共有RandomオブジェクトではなくThreadLocalRandomを使用すると、オーバーヘッドと競合が大幅に減ります。 ThreadLocalRandomの使用は、複数のタスク(各ForkJoinTaskなど)がスレッドプール内で並列に乱数を使用する場合に特に適しています。 このクラスの使用法は通常、ThreadLocalRandom.current()。nextX(...)(XはInt、Longなど)の形式にする必要があります。すべての用途がこの形式である場合、複数のスレッド間で偶発的にThreadLocalRandomを共有することは決してできません。

このクラスは、一般的に使用される追加の有界ランダム生成方法も提供します。