C#/ XNA伪随机数创建

时间:2011-10-02 23:22:17

标签: c# random numbers xna-4.0

用于创建随机数的c#/ XNA过程非常快速和简单,但是,它很可能是我见过的最差的分布随机数生成器。有没有更好的方法可以很容易地实现c#/ XNA?

rand.Next()只是不符合我的需要。

从:

static private Random rand = new Random();

我在我的程序中随机放置对象。有时10,有时200。

当调用随机对象(x val和y val在2d平面上都是随机的)时,它们会分组。生成代码很干净并且称它们很好,干净地迭代并且为每个值提取一个新的随机数。但他们分组,明显不好,毕竟随机数不是很好。我是c#的中间技能,我从as3过来,这似乎更好地处理随机性。

我很清楚它们是伪随机的,但是在Windows系统上使用C#,这种分组是怪诞的。

3 个答案:

答案 0 :(得分:2)

您可以使用XNA的System.Security.Cryptography.RandomNumberGenerator吗?

var rand = RandomNumberGenerator.Create();
byte[] bytes = new byte[4];

rand.GetBytes(bytes);

int next = BitConverter.ToInt32(bytes, 0);

获取最小/最大范围内的值:

static RandomNumberGenerator _rand = RandomNumberGenerator.Create();

static int RandomNext(int min, int max)
{
    if (min > max) throw new ArgumentOutOfRangeException("min");

    byte[] bytes = new byte[4]; 

    _rand.GetBytes(bytes);

    uint next = BitConverter.ToUInt32(bytes, 0);

    int range = max - min;

    return (int)((next % range) + min);
}

答案 1 :(得分:1)

对于我的项目,我使用简单的XOR algorythm。我不知道它分配数字有多好,但它很容易实现:

http://www.codeproject.com/KB/cs/fastrandom.aspx

答案 2 :(得分:1)

这可能还取决于您使用System.Random的方式。作为一般规则,一遍又一遍地创建Random的新实例并不是一个好主意,因为在大约同一时间创建的Random对象很可能会被添加相同的随机数(通过默认情况下,时间用作种子。)而是创建一个Random实例,并在整个程序中只使用该实例。

除非目标是安全性,这可能不是这种情况,否则最好只使用System.Random