Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 随机数行为怪异,并非完全随机_C#_.net_Visual Studio 2010 - Fatal编程技术网

C# 随机数行为怪异,并非完全随机

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

在我的.NET游戏中,我的rand函数决定了玩家五个角色中的每一个应该承受多少伤害,然而第一个角色似乎总是在等级的底部,最后一个在顶部。因此,在我的
角色[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我已经接受了之前所有问题的答案:)