4

从文档中:

不要将循环中对 Randomize 的调用与对 Random 函数的调用结合使用。通常,在对 Random 的所有调用之前,仅调用一次Randomize。

(我强调“只有一次”)

最佳实践问题:

如果 Delphi 库使用Random,它是否应该只记录初始化调用的要求Randomize,并将 Randomize 的调用留给库的用户?

或者图书馆应该负责初始化,比如

if System.RandSeed = 0 then Randomize;
4

3 回答 3

5

在我看来,这完全取决于您图书馆的结构和目的。

如果用户永远不会看到随机调用,那么我建议让库始终对其进行初始化。没有必要将其放入文档中。

另一方面,如果用户实际上通过使用您的库(我猜这是您的库的工作方式)直接调用 Random 或它的某个包装器,那么用户将(应该)知道他正在使用某种随机 -需要初始化的生成函数,因为大多数语言中的随机序列实际上是基于种子的伪随机序列。

可能是用户需要对随机序列进行多次初始化,或者他/她可能会对只初始化一次感到满意。这完全取决于用户的需求。

我不会强迫它,而是让用户可以使用 Randomize 调用,并可能让用户有可能告诉库要么处理初始化,要么把它留给他/她。在这种情况下,所有内容都应记录在案。

高温高压

于 2012-06-23T10:13:15.620 回答
2

如果您不确定,请始终调用 randomize()。
让代码依赖于它被调用的事实比依赖于它未被调用的事实要好。

这是因为randomrandomize对您的应用程序来说是全局的,您无法确定其他单元或代码段是否在某个时候调用了 randomize()。

拥有这些全局函数很方便,但它并不是一个真正干净的设计。TRandomizer 类可能更好,您可以在其中为特定范围设置种子,而不会影响应用程序的其余部分。

我想这是 DOS 时代的遗留物。

于 2012-06-23T14:33:19.407 回答
1

您始终可以为库初始化例程提供布尔参数,让用户选择调用或不调用库中的 Randomize()。还值得注意的是,自 Delphi XE(?) RTL 源以来,Randomize() 被多次调用。

您可以使用自定义 RNG - 例如,您可以使用 XorShift 拉动您的随机数。即使是简单的 XorShift 似乎也比 Delphi 内部的伪 RNG 更好:|

于 2012-06-23T11:09:43.017 回答