我正在做一个涉及系统随机生成对象的小应用程序。这是怎么回事
每个对象都有一个字段,用于指定对象的“type”。让我们说火,冰,风(虽然不是应用程序中的实际内容) 每种类型都有一个名为“possible”的字段,用于确定生成该类型的可能性。 该字段的默认值当然是1 / numberOfTypes 另一个类型的字段是列表中的“order”,假设fire为1st,ice为2nd,wind为3rd。
我天真的解决方案是使用
Math.floor(Math.random()*100 / defualtPossibilities)
并将其与type.oder匹配
因此,如果随机值为.75,并且有三种类型,Math.floor(...)
将return 2
,这意味着该对象是一个冰对象。
但是,我遇到了一些潜在的问题:
可以改变每种类型的可能性值。在这种情况下,我仍然可以生成一个随机数并使用循环来检查每个 type.order * type.possibilities ,直到它超过随机数。但我不确定是否有更好的方法。
当您更改一个 type.possibilities 时,另一个类型。可能性必须根据保持总可能性100而改变。我计划通过将变化量均匀地划分到所有其他类型来实现。这是一个好方法。
如果我在某些方面含糊不清,我很抱歉,但请帮助我^ - ^
谢谢大家!
答案 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。
显然,为了获得最佳表现,你可以预先计算总和。