【问题标题】:Randomize when something happens当事情发生时随机化
【发布时间】:2013-04-22 04:44:31
【问题描述】:

我在我的游戏中实现了一个加电功能,我希望它在杀死僵尸时有 10% 的几率应用到玩家身上。每次玩家子弹击中僵尸时,我都尝试使用此代码,但它并没有真正起作用。

double rand = Math.random() * 10 + 1;
if(rand == 1){
    power.setShrink(true);
}

我知道加电是有效的,因为如果我将它设置在 if 语句之外,播放器将会缩小。

我将如何做到这一点,以便在僵尸被杀死时有 10% 的几率使玩家应用该效果?

【问题讨论】:

  • rand 达到 1 的可能性非常低。检查它是否在某个区间,这样会更好。
  • @Juvanis 我也试过double rand = Math.random() * 1 + 1;,但也没有用。
  • 您的代码的真正问题是将double 与int 进行比较。 Java 会将 int 转换为 double 而不是 double。所以,1.0001 不等于 1.0000

标签: java math if-statement random double


【解决方案1】:

您可以使用简单的Monte-Carlo 选择:

if(Math.random() > 0.9){
   power.setShrink(true);
}

这使您有 10 次随机概率触发加电。

【讨论】:

    【解决方案2】:

    您可以在类似的逻辑中使用Random.nextInt(10)

    您当前的代码失败了,因为您的 double 很少会完全是 1

    【讨论】:

      【解决方案3】:

      双精度数是浮点数。在您的情况下,它可以是从 1 到 11 的任何数字,最高可达 53 位二进制精度。所以它不仅可以是 1,还可以是 1.01、1.02 等。因此,它恰好为 1 的几率可以忽略不计。

      在生成随机整数时最好使用Random.nextInt

      Random r = new Random(); //only do this once
      
      if(r.nextInt(10) == 0){
          power.setShrink(true);
      }
      

      【讨论】:

      • 原则上是正确的,但你的例子表明 nextInt 是一个静态方法。
      猜你喜欢
      • 2020-10-12
      • 1970-01-01
      • 2011-12-03
      • 1970-01-01
      • 2011-09-26
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多