在我的.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
答案 0 :(得分:9)
您必须重复使用相同的随机实例,否则您将无法获得真正的随机值,因为它是以当前时间作为种子创建的。如果你非常快地调用GetDamage
(例如在循环中),你将获得相同的值。
因此要么使用GetDamage
类中的字段/属性,要么将随机实例传递给方法。
private Random _rnd = new Random();
public int GetDamage(int low, int high)
{
int rand = _rnd.Next(low, high);
return rand;
}
随机数生成从种子值开始。如果相同 种子被重复使用,生成相同的数字序列。一 产生不同序列的方法是制作种子价值 与时间有关,从而与每个新系列产生不同的系列 随机的实例。默认情况下,无参数构造函数 随机类使用系统时钟生成其种子值,而 它的参数化构造函数可以取基于的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
这里有数以百计的这个问题,请浏览一下。