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

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

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

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

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

有帮助吗?

解决方案

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

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

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

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

其他提示

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

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

你的“用新种子创建一个新的生成器”打破了数学基础。然后你得到什么完全取决于你的种子,不幸的是,它不会是非常随机的。

我建议选择3:在整个程序中使用一个 RNG。如果 RNG 不是线程安全的(例如,在 .NET 中),但它使生活变得更加简单,并且您无需担心重复。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top