0

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

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);

为什么会这样?

4

4 回答 4

5

除以双数:

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;
于 2013-09-24T20:13:56.373 回答
2

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

于 2013-09-24T20:13:38.930 回答
1

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

于 2013-09-24T20:14:30.863 回答
0

正如其他人提到的: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-09-24T20:46:20.103 回答