除以Random.next总是得到0?

时间:2013-09-24 20:07:57

标签: c# random division

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

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 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分: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