2

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

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

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

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

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

4

3 回答 3

8

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

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

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

于 2008-11-25T11:24:31.607 回答
4

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

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

于 2008-11-25T11:36:56.167 回答
3

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

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

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

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

于 2008-11-25T11:43:10.290 回答