2012-06-23 31 views
4

從文檔:如果一個Delphi庫使用Random,是否應該避免調用Randomize本身?

請勿將呼叫在一個循環中以隨機與調用的 隨機函數。通常,Randomize被稱爲只有一次,在全部 調用Random之前。

(由我突出了「只有一次」)

最佳實踐的問題:如果一個Delphi庫使用Random,它應該只記錄的Randomize初始化呼叫的要求

,並將Randomize的調用留給庫的用戶?

還是應該圖書館照顧的初始化,像

if System.RandSeed = 0 then Randomize; 

回答

5

我個人認爲這完全取決於你的庫的結構和用途。

如果用戶永遠不會看到隨機調用,那麼我會建議讓庫始終初始化它。把它放在文檔中是沒有必要的。另一方面,如果用戶實際上通過使用庫(我猜是你的庫的工作方式)直接調用Random或它的一些包裝,那麼用戶將(應該)意識到他正在使用一些因爲大多數語言中的隨機序列實際上是基於種子的僞隨機序列,所以需要進行初始化的一類隨機生成函數。

這可能是因爲用戶需要多次初始化隨機序列,或者他/她會很高興初始化它一次。這完全取決於用戶的需求。

我不會強迫它,而是讓Randomize調用對用戶可用,並且可能會讓用戶有可能告訴庫要麼照顧初始化,要麼將其留給他/她。在這種情況下,所有的都應該記錄在案。

HTH

+0

+1確實,你不能假設任何事情。用戶可能會根據從固定(祕密/存儲)種子生成的隨機數字製作一些「滾動自己的」加密方案 - 這是我過去的說法;-)想象一下,當您的圖書館突然再次調用Randomize時,會造成嚴重破壞。 –

1

您可以隨時提供布爾參數庫初始化程序,可以讓用戶選擇來電或不叫隨機化()在您的圖書館。值得注意的是,隨着Delphi XE(?)RTL源代碼的推出,Randomize()被多次調用。

您可以使用自定義RNG - 例如,您可以Pimp your random numbers with XorShift。即使簡單的XorShift似乎比Delphi內部的僞RNG更好:|

2

如果你不確定,只是總是調用randomize()。
讓代碼依賴於被調用的事實,而不是調用而不是

這是因爲randomrandomize對您的應用程序是全局的,並且您無法確定某些其他單元或代碼片段是否在某個時間點調用randomize()。

擁有這些全局函數很方便,但它並不是一個乾淨的設計。 TRandomizer類可能更好,您可以在其中爲特定範圍設置種子,而不會影響應用程序的其餘部分。

我想這是DOS時代剩下的一些東西。

相關問題