2016-10-21 78 views
0

我想隨機選擇10%的時間'1',30%的時間選擇'2',另外60%選擇'3'。我想知道是否有一種方法允許我在Java中基於這些概率隨機抽樣。如何根據Java中的概率生成隨機數

謝謝

+0

**這不就是隨機數是無論如何(沒有得到太多的技術)? – byxor

+4

您可以生成一個1到100之間的隨機數。然後如果結果是1-10,則返回1,如果結果在10-40之間返回2,並且結果大於40,則返回3. – bhspencer

+1

使用數組' {1,2,2,3,3,3,3,3}'或者一個列表,洗牌並選擇一個 –

回答

1

此方法適用於所有語言。只需要一個大的隨機數,然後取一個數字的mod,然後檢查範圍。

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

我不覺得孤單對於一個方法,你只需要執行類似如下

解決方法1-10包容性產生一個隨機數,然後選擇1,2或3取決於隨機機會的概率。

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之間均勻分佈的double。然後分裂的範圍內(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 < 1.0變爲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

對於*「30%的時間」*,您的意思是「.3」,對於計算的值「.1 + .3 = .4」,在最後一次*時將「.6」範圍保留爲「1.0」 「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)];