改善随机生成功能

时间:2012-05-14 13:20:54

标签: java random

我正在做一个涉及系统随机生成对象的小应用程序。这是怎么回事

每个对象都有一个字段,用于指定对象的“type”。让我们说火,冰,风(虽然不是应用程序中的实际内容) 每种类型都有一个名为“possible”的字段,用于确定生成该类型的可能性。 该字段的默认值当然是1 / numberOfTypes 另一个类型的字段是列表中的“order”,假设fire为1st,ice为2nd,wind为3rd。

我天真的解决方案是使用 Math.floor(Math.random()*100 / defualtPossibilities)并将其与type.oder匹配 因此,如果随机值为.75,并且有三种类型,Math.floor(...)return 2,这意味着该对象是一个冰对象。

但是,我遇到了一些潜在的问题:

  1. 可以改变每种类型的可能性值。在这种情况下,我仍然可以生成一个随机数并使用循环来检查每个 type.order * type.possibilities ,直到它超过随机数。但我不确定是否有更好的方法。

  2. 当您更改一个 type.possibilities 时,另一个类型。可能性必须根据保持总可能性100而改变。我计划通过将变化量均匀地划分到所有其他类型来实现。这是一个好方法。

  3. 如果我在某些方面含糊不清,我很抱歉,但请帮助我^ - ^

    谢谢大家!

1 个答案:

答案 0 :(得分:1)

这是一个简短的解决方案:

 float weights[]; // each >0

 public int nextIndex() {     
     float sum =0;
     for (int i=weights.length; i-->0;) sum+=weights[i];
     float r = myrandom.nextFloat()*sum;
     sum = 0;
     for (int i=0; i<weights.length-1; i++) {
         sum += weights[i];
         if (r<sum) return i;
     }
     return weights.length-1;
 }

您可以单独更改每个重量。这个想法只是重新计算权重的总和,而不是假设它是100。

显然,为了获得最佳表现,你可以预先计算总和。