用于创建随机数的c#/ XNA过程非常快速和简单,但是,它很可能是我见过的最差的分布随机数生成器。有没有更好的方法可以很容易地实现c#/ XNA?
rand.Next()只是不符合我的需要。
从:
static private Random rand = new Random();
我在我的程序中随机放置对象。有时10,有时200。
当调用随机对象(x val和y val在2d平面上都是随机的)时,它们会分组。生成代码很干净并且称它们很好,干净地迭代并且为每个值提取一个新的随机数。但他们分组,明显不好,毕竟随机数不是很好。我是c#的中间技能,我从as3过来,这似乎更好地处理随机性。
我很清楚它们是伪随机的,但是在Windows系统上使用C#,这种分组是怪诞的。
答案 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。我不知道它分配数字有多好,但它很容易实现:
答案 2 :(得分:1)
这可能还取决于您使用System.Random
的方式。作为一般规则,一遍又一遍地创建Random
的新实例并不是一个好主意,因为在大约同一时间创建的Random
对象很可能会被添加相同的随机数(通过默认情况下,时间用作种子。)而是创建一个Random实例,并在整个程序中只使用该实例。
除非目标是安全性,这可能不是这种情况,否则最好只使用System.Random
。