2011-08-26 98 views
3

我有一個數組char[] Select = {'A','B','C','D','E','F','G','H','I','J'},這個數組中的每個元素有不同的概率被選中。例如,Java的高概率隨機數

int[] Weight = {10,30,25,60,20,70,10,80,20,30}; 

我的要求是選擇從該陣列5層的元件和該元件具有高權重值具有較高的概率被選擇,並且這些5個元素應該是不同的。

我的計劃是第一總和的重量

int[] weightSum = {10, 40, 65, 125, 145, 215, 225, 305, 325, 355} 

然後我使用隨機到[0355]的範圍內產生一個隨機數k。然後查找weightSum[]中大於k的第一個元素。這個過程重複5次。

問題是高概率的元素可能被多次選擇。我嘗試在每次迭代中刪除重複的元素。重複項被刪除,但重量值較高的元素未被選中。

如何解決這個問題?

謝謝。

+1

減去0你不應該尋找*最後*元素*更小*比'k'? –

回答

1

不保持的累積總和或每次進行調整:(需要用於每個選擇爲O(n),儘管)

char[] Select = {'A','B','C','D','E','F','G','H','I','J'}; 
int[] Weight = {10,30,25,60,20,70,10,80,20,30}; 
int sum = 355; 
for(int a=0;i<5;i++){ 
    int rand = (int)(Math.random()*sum); 
    int s=0;//temp cumulative sum 
    int i=0; 
    while((s+=Weight[i])<rand)i++; 
    result.add(Select[i]); 

    sum-=Weight[i];//total weight is lower now 
    Weight[i]=0;//if weight is 0 it will never be selected 

} 

編輯:固定所以不從sum

0

我真的不理解你的問題,但你的算法聽起來是正確:你應該(基於隨機數發生器)做一些像存儲在列表中的每個生成的值,但首先查看是否這個數字已經存在在列表中添加它之前。重複,直到列表中有5個數字。

3

不知道我理解正確的,但如何對這樣的事情:

  • 第一選擇後,你從char[] Select
  • 刪除選定的元素,你也int[] Weight
  • 刪除相應的權重重新int[] weightSum
  • 重複整個過程
+1

如果S77不想重複,最簡單的做法是選擇設定相應的權重值0 – emory

+0

喔啊,這是更簡單的後 – bpgergo

0

我的統計內存有點模糊,但我認爲你想要做的是在選擇它之後從元素中刪除元素。換言之,在選擇進入後,從weightSum刪除該條目並減去其Weight從所有後續條目和隨機數的範圍內。如果您使用ArrayList而不是原始數組,可能會更容易管理。

1

我每次刪除重複的時間猜想,你還必須更新weightSum陣列。