如果Delphi库使用Random,它应该避免调用Randomize本身吗?

时间:2012-06-23 09:50:19

标签: delphi random

来自文档:

  

不要将循环中的Randomize调用与调用   随机功能。通常,Randomize在所有之前仅被称为一次   调用随机。

(突出显示'我只有一次')

最佳做法问题:

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

或者库是否应该处理初始化,例如

if System.RandSeed = 0 then Randomize;

3 个答案:

答案 0 :(得分:5)

我认为这完全取决于你图书馆的结构和目的。

如果用户永远不会看到随机调用,那么我建议让库始终初始化它。将它放在文档中是没有必要的。

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

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

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

HTH

答案 1 :(得分:2)

如果你不确定,只需要随便调用randomize()。
最好让代码依赖于它被调用的事实,而不是它被调用的事实。

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

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

我想这是DOS时代的一些遗留问题。

答案 2 :(得分:1)

您始终可以使用布尔参数提供库初始化例程,该参数将允许用户选择是否调用库中的Randomize()。值得注意的是,自Delphi XE(?)RTL源以来,Randomize()被多次调用。

您可以使用自定义RNG - 例如,您可以Pimp your random numbers with XorShift。即使是简单的XorShift似乎也比Delphi内部的伪RNG更好:|