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

时间:2013-04-11 12:58:23

标签: c# .net 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;
}

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

int Damage = GetDamage(3, 10);
Characters[Target].Health = Characters[Target].Health - Damage;

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

Number 1: 3-4
Number 2: 4-6
Number 3: 5-7
Number 4: 7-8
Number 5: 8-9

3 个答案:

答案 0 :(得分:9)

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

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

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

MSDN

  

随机数生成从种子值开始。如果相同   种子被重复使用,生成相同的数字序列。一   产生不同序列的方法是制作种子价值   与时间有关,从而与每个新系列产生不同的系列   随机的实例。默认情况下,无参数构造函数   随机类使用系统时钟生成其种子值,而   它的参数化构造函数可以取基于的Int32值   当前时间的刻度数。但是,因为时钟已经   有限分辨率,使用无参数构造函数创建   紧密连续的不同随机对象创建随机数   产生相同随机数序列的生成器。 :此   可以通过创建单个Random对象而不是   多个。

答案 1 :(得分:3)

你需要让你的Random实例保持静态,这会使它播种一次,之后你会得到一个更随机的数字。

static Random r = new Random();

public int GetDamage(int low, int high)
{
    int rand = r.Next(low, high);
    return rand;
}

答案 2 :(得分:2)

您需要为随机数生成器播种。

请参阅:How do I seed a random class to avoid getting duplicate random values

这里有数以百计的这个问题,请浏览一下。