【问题标题】:Random Number Generator: Class level or Method level?随机数生成器:类级别还是方法级别?
【发布时间】:2010-09-23 22:35:48
【问题描述】:

使用随机数生成器时,更好的方法是使用它来获得更大的新值随机性:

  1. 有没有每次实例化一个新的RNG实例然后返回值的方法?

  2. 在类级别有一个 RNG 实例,它在构造函数中被实例化一次,并且所有后续调用都使用现有实例来获取新的随机值?

问题是可能有很多次调用随机数,通常在不同的范围内,彼此没有联系。

这不是性能问题,因此每次调用都可能实例化一个新实例这一事实没有任何区别。这都是关于返回值的随机性。

【问题讨论】:

  • 我实际上在 java 中创建了一个类,它向 random.org 查询随机数或一组随机数。如果有人感兴趣,请告诉我。

标签: random correctness


【解决方案1】:

实际上,选项 1 不起作用。

选项 2 是唯一的选择。 RNG 绝对要求您从单个种子按顺序生成值。

您的“使用新种子创建新生成器”打破了数学基础。那么你得到什么完全取决于你的种子,遗憾的是,这不会是非常随机的。

【解决方案2】:

我建议选项 3:在整个程序中使用单个 RNG。如果 RNG 不是线程安全的(例如在 .NET 中),它需要锁定或线程本地,但它使生活变得更简单,您无需担心重复。

有关我为此目的编写的 .NET StaticRandom 类的详细信息,请参阅 the relevant MiscUtil page。 (这非常简单——一点也不聪明。)

【讨论】:

  • 同意。您希望只为 RNG 播种一次(意味着使用一个全局实例)。
【解决方案3】:

编辑:我相信我的意思是选项 3,正如另一个答案中提到的,即全局随机管理器,尽管在特定类中你可以做完全相同的事情。

使用选项 2 的另一个优点是,如果您的软件需要“重播”功能,您可以简单地存储用于初始化 RNG 的种子。下一次,您只需要强制 RNG 使用存储的种子,您将获得完全相同的行为集,假设没有其他问题,例如可能改变执行顺序的并发/线程 em>。

如果您的软件正在运行需要大量随机性的实验,但您可能希望重复特定的运行以向其他人展示,您可能想要执行类似的操作。它在电脑游戏中也被大量使用,其中人工智能将根据可能选择的权重做出决定,但最终会有一个随机数“挑选”他们采取的行动。

它还可以调试仅偶尔出现的临时错误。如果您不存储每次运行的种子,则无法重新创建导致错误的确切条件。

【讨论】:

  • 在模拟中,这种技术被称为“通用随机数”,如果操作得当,可以在两个系统之间进行同等有效性的比较,并且样本更少。
猜你喜欢
  • 2012-07-05
  • 2016-02-07
  • 2014-08-09
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 2021-08-17
  • 2019-06-27
  • 1970-01-01
相关资源
最近更新 更多