2011-08-26 192 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阵列。