快速随机发生器

如何在C#中创建一个快速RNG(随机数生成器),支持使用maxValue(和/或minValue)填充字节数组? 我找到了这个http://www.codeproject.com/KB/cs/fastrandom.aspx但没有这些function。

您使用整数填充字节的事实与System.Random的典型用例不同,如果您确实需要,可能会严重打败它。

System.Random是为一般用途而制作的。 (事实上​​,当我对它们进行速度和分布测试时,我通常会发现系统随机例程没有用。)有些情况下你需要别的东西。 但是你必须非常清楚你的需求。 多快? 你愿意放弃什么?

如果你真的需要“快速”, Marsaglia已经生产了许多非常快速的随机数发生器,可以根据你的需要进行调整。 以下是关于其中一个的一些链接,Xorshift:

  • Xorshift(维基百科)
  • 在C#中最快的Xorshift实现,以及将它与System.Random进行比较的测量
  • Diehard测试很有意思。
  • Agner拥有许多快速randoms的C ++代码 。
  • 这是一个使用SIMD指令的快速扭转器 。

最后一个解决了您定位字节的事实。

我只需要几次超快速的randoms。 在具有慢处理器的控制台游戏中,随机可以在达到帧速率目标和不击中它之间产生差异。 你的用例是什么? 无论如何,如果可以,请使用System.Random。

或者,在您的问题中调整您链接的例程(作者声称其速度是System.Random的8倍。)

System.Random足够快,几乎可以用于任何典型用途。 如果您在使用包含System.Random调用的代码时遇到性能问题,请确保尝试构建新的Random 之前对代码进行概要分析。 机会是您的性能问题不在框架中,而是在您自己的代码中。

如果您在循环中调用Random,请确保每次迭代都不创建新的Random实例,而是重新使用常见的Random实例。 这样做可以提高性能,因为您不是要为GC清理创建新对象,还会提高生成的随机数的质量。

如果你有一个从单位间隔返回数字的随机数生成器,就像你提到的Code Project文章中那样,那么你可以先使用该生成器生成一个值u然后返回a + (ba)*u来获取值a和b之间。

使用加密服务….

 RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider(); byte[] bytes= new byte[5]; crypto.GetBytes(bytes); 

当然,这只满足字节区域要求……

您可以使用Reflector将System.Random反编译为C#。 这将为您提供满足您要求的快速随机数生成器的C#代码。