2

在我的 .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
4

3 回答 3

9

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

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

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

MSDN

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

于 2013-04-11T13:01:36.507 回答
3

您需要使您的Random实例静态化,这将为其播种一次,然后您将获得一个看起来更随机的数字。

static Random r = new Random();

public int GetDamage(int low, int high)
{
    int rand = r.Next(low, high);
    return rand;
}
于 2013-04-11T13:00:41.240 回答
2

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

请参阅:如何为随机类播种以避免获得重复的随机值

从字面上看,这里有数百个这个问题,看看周围。

于 2013-04-11T13:00:33.600 回答