【问题标题】:Dividing by Random.next always results in 0?除以 Random.next 总是得到 0?
【发布时间】:2013-09-24 20:07:56
【问题描述】:

这个真的让我很困惑。我正在编写一个带有一些随机变化的损坏算法。当我计算变化时,这就是它的样子。

Random random = new Random();
Double variation = random.Next(85, 115) / 100;
Double damage = restOfAlgorithm * variation;

当我这样做时,变化总是输出 0。但是,如果我像下面这样,它将输出预期的结果。

Random random = new Random();
Double variation = random.Next(85, 115);
Double damage = restOfAlgorithm * (variation / 100);

为什么会这样?

【问题讨论】:

  • 首先是Next,而不是next。尝试random.Next(85, 115) / 100.0; 避免整数除法
  • 因为你在做整数除法?
  • 100 是一个整数。 (double)100
  • @I4V 在我的代码中有这样的内容,编辑了问题。
  • 使用random.Next(85, 115) / 100d;

标签: c# random division


【解决方案1】:

除以双数:

Double variation = random.Next(85, 115) / 100.0;

Double variation = random.Next(85, 115) / (double)100;

否则,您将进行整数运算(因为 Random.Next 返回一个整数,而 100 也是整数)。

我认为最好的做法是了解您正在使用的类型并将所有内容转换为所需的类型。当然这不是必需的,因为编译器会隐式转换值。但是通过显式转换,以后查看代码的人可以看到您的意图。

Double variation = (double)random.Next(85, 115) / 100d;

【讨论】:

    【解决方案2】:

    因为random.Next 会给你一个整数,而 100 也是一个整数。因此,将它们除以 0 或 1,具体取决于您的随机数是低于还是高于 100。您需要除以 100.0 才能获得双重除法。

    【讨论】:

      【解决方案3】:

      random.Next(lower_bound, upper_bound) 方法返回一个整数值(int 类型)。在第一种情况下,您有 random.Next(85, 115) / 100,这是 int 变量的划分。在 C# 中,它意味着整数除法(当同时使用数字和整数时)。这就是为什么它有时会返回 0。
      在第二种情况下,您使用双精度类型的variation。这就是 C# 将结果转换为双精度然后一切正常的原因。

      【讨论】:

        【解决方案4】:

        正如其他人提到的:random.Next() 将返回一个整数。

        改为使用:random.NextDouble(),这将为您提供一个很好的双精度计算,因为它返回一个介于 0 和 1 之间的双精度,您可以进一步处理以适应您的范围。

        double variation = random.NextDouble() * range + minimum;
        

        或者你可以除以其他答案中提到的双倍:

        double variation = random.Next(minimum, minimum + range) / 1.0 /*or*/ (double)1
        

        【讨论】:

          猜你喜欢
          • 2013-12-23
          • 2018-12-23
          • 2020-11-23
          • 2020-06-08
          • 1970-01-01
          • 1970-01-01
          • 2010-12-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多