【问题标题】:Fast Random Generator快速随机发生器
【发布时间】:2013-04-07 18:50:28
【问题描述】:

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

【问题讨论】:

  • System.Random 太慢了吗?
  • 很有可能。他正在填充字节,这是一个非常特殊的情况。旨在填充字节的代码可能会快一个数量级或更多。他需要那种速度吗?我不知道。
  • 是的,System.Random 太慢了。我有很多随机数要生成。

标签: c# random


【解决方案1】:

您使用整数填充字节的事实与 System.Random 的典型用例有很大不同,如果您真的需要,您可能会很糟糕地击败它。

System.Random 用于一般用途。 (事实上​​,当我对它们进行速度和分布测试时,我通常会发现系统随机例程没有什么启发性。)在某些情况下,您会想要其他东西。但是您必须非常明确地说明您的需求。多快?你愿意放弃什么?

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

最后一个解决了您以字节为目标的事实。

我只需要几次超快速随机数。在处理器速度较慢的主机游戏中,随机可能会在达到帧速率目标和不达到帧速率目标之间产生差异。你的用例是什么?如果可以,请务必使用 System.Random。

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

【讨论】:

  • 最后一个链接检查起来很有趣,+1
  • 感谢您的回答,RNG 必须尽可能快,我有很多随机数要在几秒钟内生成(10^9 甚至更多)。我尝试在我的链接中调整例程但我没有成功,你能帮帮我吗?
  • 有很多可能性。想象一下,您已经为一个范围(例如,0-100)设置了一个 4k 的随机数缓冲区。使用随机数生成器选择一个偏移量并从列表中抓取 16 个字节。然后生成另一个偏移量并获取另外 16 个字节。这不会是非常地随机的,但它可能是足够随机的。尽管我问了,你还没有告诉我你愿意放弃什么来获得速度。您将如何处理所有这些数字?
  • 这些数字是用于一些测试的,并不是 100% 随机的
【解决方案2】:

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

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

【讨论】:

  • 我的代码只需在几秒钟内生成许多随机数
  • 令人惊讶的是,有多少 SO 答案决定争论提问者的需求而不是回答问题。
  • @tazzo:多少是多少?你有什么具体要求? @Nosredna:有时回答问题和帮助提问者是两件不同的事情。谁在吵架?
  • 回答这个问题也为未来真正需要更快的人们提供了答案。
【解决方案3】:

如果您有一个从单位间隔返回数字的随机数生成器,例如您提到的代码项目文章中的那个,那么您可以首先使用该生成器生成一个值 u,然后返回 a + (b-a)*u 以获得a 和 b 之间的值。

【讨论】:

  • 你的公式不正确,如果我选择 A=5 和 B=20 和 U=55 我得到 5+(20-5)*55=830。正确的公式是 U/(UMAX+1)*(B-A)+A 其中 UMAX 是随机数的最大值。
  • 如果随机值u来自单位区间,即在0到1之间,则公式正确。在您的示例中,u = 55 不是介于 0 和 1 之间的数字。
【解决方案4】:

使用加密服务....

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

当然,这只满足字节面积要求……

【讨论】:

  • 我自己没有计时,但我猜 RNGCryptoServiceProvider 具有加密安全的额外属性,会比 System.Random 慢。
  • 我已经检查了 RNGCryptoServiceProvider 但不符合我的需要,就是要放慢速度并且不要让生成的随机数达到最大值。
【解决方案5】:

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

【讨论】:

  • 实际上,不...框架已经过预编译和优化,您无法与之竞争(除非您还预编译了代码)。至少这是我的经验(在试图超越框架时;))。
  • 他究竟为什么要这么做?想必,既然他问了,Random太慢了,不然他会用那个,不是吗?
  • @Bobby:令人沮丧的是,真的。不过,预编译自己的代码也无济于事。
  • 我想要的只是暗示使用 System.Random(直接)。我想我应该比人们在互联网上发现讽刺更了解... =)
  • System.Random 不是一个出色的 RNG,而是一个通用(且简单)的 RNG。没有什么可以重复使用的。
猜你喜欢
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 2015-01-01
  • 2020-05-23
  • 2010-11-05
  • 2013-03-18
  • 2015-05-25
  • 2011-01-16
相关资源
最近更新 更多