【问题标题】:Improving random generation function改进随机生成功能
【发布时间】:2012-05-14 13:20:53
【问题描述】:

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

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

我对此的天真解决方案是使用 Math.floor(Math.random()*100 / defualtPossibilities) 并与 type.oder 匹配 所以如果随机值为0.75,并且有三种类型,Math.floor(...)return 2表示该对象是冰对象。

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

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

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

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

谢谢大家!

【问题讨论】:

  • 你想生成随机字符串还是随机数还是字母数字?

标签: java random


【解决方案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。

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

【讨论】:

  • 非常感谢您的回答!它确实有助于简化我的问题。我现在看到我试图保持总和 100 是多么愚蠢。保持总和 100 的想法来自我实现总长度恒定而组件长度可能相应变化的仪表的想法。现在我知道我可以保留此功能而无需恒定 100。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2014-05-10
  • 2019-01-25
  • 2015-10-27
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多