2016-10-21 18 views
0

「1」の時間を10%、「2」を時間の30%、「3」を他の60%の時間をランダムに選択したいとします。私は、Javaでこれらの確率に基づいて無作為にサンプリングする方法があるのだろうかと思っています。確率の確率でJavaを生成する方法

ありがとうございます

+0

** "確率に基づいてランダムな番号" ** ---それは、ランダムな数字は(あまりにも技術取得せずに)とにかくあるものではありませんか? – byxor

+4

1から100の間の乱数を生成することができます。結果が1-10の場合は1、結果が10-40の場合は2、結果が40より大きい場合は3を返します。 – bhspencer

+1

配列 ' {1、2、2、2、3、3、3、3} 'またはリストをシャッフルして1つを選択する –

答えて

1

この方法はすべての言語で適用されます。ちょうど大きな乱数を取得し、次にいくつかの数のモードを取って、範囲を確認してください。

Random rand = new Random(); 
int r = rand.nextInt(10000000); 
int m = r % 10; 
if (m < 1) return 1; // 10 % 
else if (m < 4) return 2; // 30 % 
else return 3; // 60 % 
0

私はtheresのそのための方法を考えていない、あなただけの包括的な1-10から乱数を生成して、1,2またはを選択し、以下の

のような回避策を実行する必要がありますランダムチャンスの確率に応じて、

if (random_number == 1) 
{ 
    result = 1; 
} 
else if (random_number <= 4) 
{ 
    result = 2; 
} 
else 
{ 
result = 3; 
} 
+0

メソッドがあります。 'nextDouble'は0から1.0の間で一様に分布した数値を返します。それを使って選択することができます。 – ChiefTwoPencils

3

まず、0.0と1.0の間に均等に分布する倍精度を生成します。次に希望の確率に対応するサブ範囲に範囲(0.0 < X < 1.0)分割:

  • 0.0 < = X < 0.1 1(間隔幅(0.1 - 0.0)= 0.1、または10%)になります;
  • 0.1 < = x < 0.4は2になります(間隔幅は(0.4 - 0.1)= 0.3、または30%です)。
  • 0.4 < = x <は、3(間隔幅は(1.0 - 0.4)= 0.6、または60%)になります。コードで

:(。rngjava.util.Randomのインスタンスである)

double rand = rng.nextDouble(); 
if (rand < .1) { 
    return 1; 
} else if (rand < .1 + .3) { 
    return 2; 
} else { 
    return 3; 
} 

この方法は、容易にターゲット確率の任意のセットに一般化することができます。

+0

計算された '.1 + .3 = .4'の値に対して*" 30%of time "*のために' .3'を意味し、最後の* "時間の60%" *。 – Andreas

+0

@アンドレアス:固定、ありがとう。 – NPE

0

これを試してください。

static final int[] RATES = { 1, 2, 2, 2, 3, 3, 3, 3, 3, 3 }; 

Random random = new Random(); 
int result = RATES[random.nextInt(RATES.length)];