C#/XNA伪随机数生成

5

在使用c#/XNA创建随机数的过程中,方法相当快捷和简单,但是这可能是我见过的最糟糕的分布式随机数生成器。是否有更好的方法可以轻松实现c#/XNA?

rand.Next()不适合我的需求。

来自:

static private Random rand = new Random();

我随机地放置对象,在我的程序中到处都是。有时候10个,有时候200个。

当调用随机对象时(x值和y值都是2d平面上的随机数),它们会聚集在一起。生成代码简洁,执行良好,并且每个值都使用新的随机数,但它们聚集在一起,聚集现象非常明显,这毕竟不是一个好的随机数。我对c#有一定的技能,我从as3转过来,似乎as3处理随机数更好一些。

我很清楚它们是伪随机数,但在Windows系统上,c#中的聚集现象非常丑陋。


你指的是哪个随机数生成过程?是 System.Random 吗? - Alastair Pitts
我更新了一下,加入了更多的信息。还有必要的抱怨和牢骚。 - SimpleRookie
3个回答

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);
}

如何为该方法设置最小值和最大值? - SimpleRookie
1
你能举个例子说明你的最小/最大值是多少吗? - Jeff Ogata
1
@SimpleRookie - 请看我的编辑。我添加了代码以获取范围内的随机数。我很好奇分布是否比标准的Random.Next更好。 - Jeff Ogata
那是一个非常好的替代,非常感谢。我希望我可以多次点赞你的答案。你的解决方案结果的范围远远超出了常见的 Random.Next。 - SimpleRookie
附加信息:我注意到这个解决方案给我的一个小问题是在硬币翻转方面。0,1调用只会返回一个值。所以我必须将其提升到(0,2)才能从函数中获得正确的响应,这是一个奇怪的小细节,我相信比我聪明的人可以评论一下。 - SimpleRookie
显示剩余2条评论

1

1

这也可能取决于您如何使用 System.Random。通常情况下,反复创建 Random 实例并不是一个好主意,因为在大约相同的时间创建的 Random 对象很可能会使用相同的随机数种子(默认情况下,使用时间作为种子)。相反,创建一个单独的 Random 实例,并在整个程序中仅使用该实例。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接