C# 随机数行为怪异,并非完全随机
在我的.NET游戏中,我的rand函数决定了玩家五个角色中的每一个应该承受多少伤害,然而第一个角色似乎总是在等级的底部,最后一个在顶部。因此,在我的C# 随机数行为怪异,并非完全随机,c#,.net,visual-studio-2010,C#,.net,Visual Studio 2010,在我的.NET游戏中,我的rand函数决定了玩家五个角色中的每一个应该承受多少伤害,然而第一个角色似乎总是在等级的底部,最后一个在顶部。因此,在我的角色[0]中,伤害很少超过最小rand值的1,并且对于较高索引上的每个角色,所受到的伤害只是从较高级别随机抽取的 public int GetDamage(int low, int high) { Random r = new Random(); int rand = r.Next(low, high); return ran
角色[0]
中,伤害很少超过最小rand值的1,并且对于较高索引上的每个角色
,所受到的伤害只是从较高级别随机抽取的
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;
Number 1: 3-4
Number 2: 4-6
Number 3: 5-7
Number 4: 7-8
Number 5: 8-9
在本例中,dmg的划分如下:
int Damage = GetDamage(3, 10);
Characters[Target].Health = Characters[Target].Health - Damage;
Number 1: 3-4
Number 2: 4-6
Number 3: 5-7
Number 4: 7-8
Number 5: 8-9
您需要为随机数生成器设置种子 见:
这里有成百上千个这样的问题,大家看看。您需要使您的
随机
实例保持静态,这会使其种子化一次,然后您将得到一个看起来更随机的数字
static Random r = new Random();
public int GetDamage(int low, int high)
{
int rand = r.Next(low, high);
return rand;
}
您必须重用同一个随机实例,否则将无法获得真正的随机值,因为它是以当前时间作为种子创建的。如果您非常快速地调用
GetDamage
(例如在循环中),您将始终获得相同的值
因此,要么使用GetDamage
类中的字段/属性,要么将随机实例传递给该方法
private Random _rnd = new Random();
public int GetDamage(int low, int high)
{
int rand = _rnd.Next(low, high);
return rand;
}
随机数生成从种子值开始。如果相同
重复使用种子,生成相同的数字序列。一个
产生不同序列的方法是使种子具有价值
与时间相关,因此每种新产品都会产生不同的系列
随机的实例。默认情况下,的无参数构造函数
Random类使用系统时钟生成其种子值,而
它的参数化构造函数可以基于
当前时间内的刻度数。然而,因为时钟已经停止了
有限分辨率,使用无参数构造函数创建
连续排列的不同随机对象创建随机数
生成相同随机数序列的生成器这个
问题可以通过创建单个随机对象而不是
多个。
哦,真的吗?非种子随机生成器不是真正随机的?相关:不需要讽刺。相关:种子如何使其“更”随机?真正的问题是,将创建多个
Random
实例,可能使用相同的种子(毫秒)生成相同的伪随机数序列。经验法则:为整个应用程序提供一个Random
实例,除非您确切知道为什么需要多个实例。附带说明:当在多个线程上使用相同的Random
对象时,Random
应该同步,否则它将只返回0
。不知道Random
是从当前时间+1开始预选的,这是一个很好的例子。@Tom别忘了接受最适合你的答案;)@无需等待计时器熄灭:P我已经接受了之前所有问题的答案:)