2013-09-24 180 views
0

請幫助我根據用戶輸入的%生成隨機數。
例如,具有的60,10和30的輸入,輸出應該是:70-80
30%的隨機數的0-70範圍內的隨機數的多範圍隨機數生成器

60%
10% 80以上的隨機數

我應該使用多範圍發生器嗎?
或所有的可能性?

下面是代碼:

import java.util.ArrayList; 

import java.util.List; 

import java.util.Random; 

class RandomInRanges 
{ 
    private final List<Integer> range = new ArrayList(); 

    RandomInRanges(int min, int max) 
    { 
     this.addRange(min, max); 
    } 

    final void addRange(int min, int max) 
    { 
     for(int i = min; i <= max; i++) 
     { 
      this.range.add(i); 
     } 
    } 

    int getRandom() 
    { 
     return this.range.get(new Random().nextInt(this.range.size())); 
    } 

    public static void main(String[] args) 
    { 
     RandomInRanges rir = new RandomInRanges(1, 200); 
     rir.addRange(50, 60); 
     System.out.println(rir.getRandom()); 
    } 
} 
+0

您必須證明對正在解決的問題有最少的瞭解 – Grammin

+1

是您的'?'鍵粘性?可能想查看有關清潔鍵盤的信息。 –

+2

範圍(0-70,70-80,80+)來自哪裏?第一或第二範圍是70嗎?你想要整數還是別的?什麼是要生成的最大隨機數 - 「Integer.MAX_VALUE」? –

回答

3

的一般方法可以如下:

  • 基於該頻率分區單位間隔(0,1)成多個區域。
  • 定義從每個分區元素到對應的期望範圍的線性映射。
  • 生成均勻分佈在(0,1)上的隨機數。
  • 根據每個隨機數落在(0,1)的哪一部分,應用適當的映射。

使用您發佈的示例,範圍將爲(0,.6),(.6,.7),(.7,1)。第一個映射將從(0,.6)到(0,70):y = 70 * x/0.6。第二個映射將從(0.6,0.7)到(70,80):y = 70 + 100 *(x - 0.6)。第三次映射將需要知道您想要生成的最大數量。

上述工作適用於多個範圍內的連續均勻分佈。請注意,範圍全部是開放的(對於連續分佈來說,這不是問題,因爲正好碰到邊界點的概率是零,並且可以任意解決關係。如果要對整數值執行此操作,可以使用我們需要注意一點,以確保端點得到適當的處理,從而避免引入偏差。

最後(希望它很明顯):這隻會在if所需的輸出範圍是不相交的對於具有連續範圍的離散分佈(如在您的示例中),這將需要決定每個邊界點在哪個範圍內下降