2014-11-08 204 views
1

所以我想要在Java中獲得統一分佈的列表的隨機元素。我知道,在Random類,例如nextInt方法,已經給我這樣的事情:隨機均勻分佈

返回介於0(含)僞隨機,均勻分佈的int值和指定值(不包括),從畫這個隨機數發生器的序列。

所以給出類似下面的代碼:

Random rnd = new Random(); 
int numTimes = 10; 
for(int i = 0; i < numTimes*n; i++){ 
    System.out.println(rnd.nextInt(10)); 
} 

我預期的小「N」我不能完全看到一個很好的均勻分佈,可能增加的話,我會看到更好的東西。所以我的問題是,如何保證小n內的均勻分佈,換句話說,「n = 2」我怎樣才能至少每次得到一個數字?


試圖解釋更好:給10號範圍的數據集,並且例如20次迭代,有一個方法,每個號印1-3次,換句話說,至少一次?

+4

如果你保證它,那麼它是不是隨機的... – irrelephant 2014-11-08 05:06:09

+0

在(離散)均勻分佈中,每個值具有相等的**機會**發生。這並不意味着每個值都會出現相同的時間。你的代碼對於小的「n」沒有任何問題。 – 2014-11-08 05:31:58

+0

你想要它是統一的隨機數,還是你想看到每個數字相等的次數? – immibis 2014-11-08 05:33:30

回答

0

如果您想生成的數字發生的次數完全相同(與統一分佈不同),那麼有一個更好的方法可以做到這一點。

int n = 2; // your "n" 
int t = 100; // how often you want each number x to occur, where 0 <= x < n 

// Build a list of numbers 
List<Integer> l = new ArrayList<>(); 
for (int i = 0; i < t; i++) { 
    for (int j = 0; j < n; j++) { 
     l.add(j); 
    } 
} 
// Shuffle the list randomly; this ensures the order is random but each number x occurs 
// as often as any other x 
Collections.shuffle(l); 

for (Integer value : l) { 
    System.out.println(value); 
} 

如果你想有一些數字至少一次,但不關心別人;然後至少插入一個您想要的每個數字,然後隨機選擇其他數字。如果我正確理解你,你至少需要一次數字1,2和3,然後隨機數字1,2和3.所以,那將是:

int n = 3; // your "n" 

// Build a list of numbers 
List<Integer> l = new ArrayList<>(); 
for (int x = 1; x <= n; x++) { 
    l.add(x); 
} 

int t = 17; // add 17 more random numbers in range 1-3 inclusive 

for (int i = 0; i < t; i++) { 
    l.add(rnd.nextInt(n) + 1); 
} 

// Shuffle 
Collections.shuffle(l); 

// Print 
for (Integer value : l) { 
    System.out.println(value); 
} 
+0

更改for循環策略,它幾乎看起來像我期待的。考慮到「t = 10」,按照你所做的方式,我會隨機從範圍[0-9]中兩次獲得數字,這將會得到保證。但我希望能像20次迭代一樣,每個數字都被訪問1-3次,但至少有一次。 – 2014-11-08 05:57:10

+0

如果t = 10,n = 2,則得到數字0和1的10倍。 – 2014-11-08 15:32:17

+0

好吧,您設法得到我期待的結果,並帶來一個很好的解決方法。但我不認爲這會給我更好的表現,就像你說的那樣「在(離散)均勻分佈中,每個值都有相等的發生機會,並不意味着每個值的出現次數相等時間「,我無法保證。 – 2014-11-08 19:04:38