1

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

每个对象都有一个指定对象“类型”的字段。假设火、冰、风(虽然不是应用程序中的实际事物)每种类型都有一个名为“可能性”的字段,用于确定生成该类型的可能性。这个字段的默认值当然是 1/numberOfTypes 类型的另一个字段是它在列表中的“顺序”,假设火是第一,冰是第二,风是第三。

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

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

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

  2. 当您更改一种type.possibilities时,另一种类型。可能性必须根据总可能性100而改变。我计划通过将变化量平均分配给所有其他类型来做到这一点。是不是一个好办法。

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

谢谢你们!

4

1 回答 1

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。

显然,为了获得最佳性能,您可以预先计算总和。

于 2012-05-14T13:38:59.967 回答