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 で割る:

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 も整数であるためです。したがって、それらを割ると、乱数が100未満か100を超えるかによって、0または1になります。2100.0倍の除算を行うには、で除算する必要があります。

于 2013-09-24T20:13:38.930 に答える
1

このメソッドrandom.Next(lower_bound, upper_bound)は整数値 ( inttype ) を返します。最初のケースではrandom.Next(85, 115) / 100、これは int 変数の分割です。C# では、整数除算を意味します (数値と整数の両方の場合)。そのため、0 が返されることがあります
。2 番目のケースvariationでは、double 型の which を使用します。そのため、C# は結果を double に変換し、すべて問題ありません。

于 2013-09-24T20:14:30.863 に答える