如何在C#中创建一个快速RNG(随机数生成器),支持使用maxValue(和/或minValue)填充字节数组? 我找到了这个http://www.codeproject.com/KB/cs/fastrandom.aspx,但没有这些功能。
答案 0 :(得分:26)
你用整数填充字节的事实与System.Random的典型用例不同,如果你真的需要,你可能会打得很糟糕。
System.Random是为一般用途而制作的。 (事实上,当我对它们进行速度和分布测试时,我通常会发现系统随机例程没有用。)有些情况下你需要别的东西。但是你必须非常清楚你的需求。多快?你愿意放弃什么?
如果你真的需要“快速”,Marsaglia已经产生了许多非常快速的随机数发生器,可以根据你的需要进行调整。以下是关于其中一个的一些链接,Xorshift:
最后一个解决了你的目标是字节。
我只需要几次超快速的randoms。在具有慢速处理器的控制台游戏中,随机可以在达到帧速率目标和不击中它之间产生差异。你的用例是什么?无论如何,如果可以,请使用System.Random。
或者,在您的问题中修改您链接的例程(作者声称它是System.Random的8倍速度。)
答案 1 :(得分:13)
System.Random足够快,适用于任何典型用途。如果您在使用包含System.Random调用的代码时遇到性能问题,请确保在尝试构建新的Random之前编译代码。机会是您的性能问题不在框架中,而是在您自己的代码中。
如果您在循环中调用Random,请确保每次迭代都不创建新的Random实例,而是重新使用常见的Random实例。这样做可以提高性能,因为您不是要为GC清理创建新对象,还会提高生成的随机数的质量。
答案 2 :(得分:0)
如果你有一个从单位间隔返回数字的随机数生成器,就像你提到的Code Project文章中那样,那么你可以先使用该生成器生成一个值u
,然后返回{{1获取a和b之间的值。
答案 3 :(得分:-1)
使用加密服务....
RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider();
byte[] bytes= new byte[5];
crypto.GetBytes(bytes);
当然,这只满足字节区域要求......
答案 4 :(得分:-4)
您可以使用Reflector将System.Random反编译为C#。这将为您提供满足您要求的快速随机数生成器的C#代码。