随机数表现得很奇怪,而不是完全随机

Tom*_*Tom 2 .net c# visual-studio-2010

在我的.NET游戏中,我的rand函数确定玩家五个角色应该承受多少伤害,但是第一个似乎总是在比例的底部,最后一个在顶部.所以在我Character[0]的伤害中,伤害很少超过最小兰特值的1倍以上,并且对于每个Character更高的指数,所造成的伤害只是从比例越高的位置随机化.

public int GetDamage(int low, int high)
{
    Random r = new Random();
    int rand = r.Next(low, high);
    return rand;
}
Run Code Online (Sandbox Code Playgroud)

这是我使用的随机数.然后我像这样更新健康状况:

int Damage = GetDamage(3, 10);
Characters[Target].Health = Characters[Target].Health - Damage;
Run Code Online (Sandbox Code Playgroud)

在这个例子中,dmg分为这样:

Number 1: 3-4
Number 2: 4-6
Number 3: 5-7
Number 4: 7-8
Number 5: 8-9
Run Code Online (Sandbox Code Playgroud)

Tim*_*ter 9

您必须重复使用相同的随机实例,否则您将无法获得真正的随机值,因为它是以当前时间作为种子创建的.如果你打得GetDamage非常快(例如在一个循环中)你会得到相同的值.

因此要么在类中使用字段/属性,GetDamage要么将随机实例传递给方法.

private Random _rnd = new Random();
public int GetDamage(int low, int high)
{
    int rand = _rnd.Next(low, high);
    return rand;
}
Run Code Online (Sandbox Code Playgroud)

MSDN

随机数生成从种子值开始.如果重复使用相同的种子,则生成相同的数字序列.产生不同序列的一种方法是使种子值与时间相关,从而与每个新的Random实例产生不同的序列.默认情况下,Random类的无参数构造函数使用系统时钟生成其种子值,而其参数化构造函数可以根据当前时间中的滴答数采用Int32值.但是,由于时钟具有有限的分辨率,因此使用无参数构造函数以紧密连续的方式创建不同的随机对象会创建随机数生成器,从而生成相同的随机数序列. 通过创建单个Random对象而不是多个Random对象可以避免此问题.