C 為什麼Random類不做靜態?

時間 2021-06-01 05:56:14

1樓:程子昂

這保證每個Random例項都是乙個固定的偽隨機數生成器(PRNG),也就是說兩個Random例項如果用同乙個隨機數種子的話生成的隨機數序列是一樣的(預設的種子是系統時間)。

這個性質在某些地方會很有用,譬如密碼學裡的對稱流加密就可以用PRNG實現(總這個角度講Random其實也不太安全,RNGCyptoServiceProvider之類的CSPRNG更合適),這時候種子就是秘鑰;再譬如說你想debug乙個隨機演算法,用乙個確定的種子和PRNG就可以確保兩次執行生成的偽隨機序列是一樣的,就能重複演算法過程。

2樓:Milo Yip

因為偽隨機數本質上是固定的數列,程式中各個部分擁有、管理自己的數列很正常。有時候還需借助數列的決定性(deterministic),達致資料同步或是可重複地呈現相同的結果。

偽隨機數生成器設計成類才好用啊,不要被 C 語言的 rand() 或類似的設計影響了,C++11 標準庫還有各種偽隨機數類了。

3樓:「已登出」

因為不安全。

並不是說執行緒安全,而是有可能猜到隨機數大概的走向。

如果要弄清這個問題,你得從C語言的隨機函式開始研究,而且過程還有些複雜。線索:C語言,為什麼隨機函式會出現重複?

我第一次研究這個問題,是室友在魔獸世界裡擲骰子,我找了乙個方法可以提高他擲骰子點數,不知道後續版本有沒有修復這個bug。

4樓:

@Belleve 已經說出了原因,我就不重複了

至於題主想要通過靜態類實現的,又要執行緒安全,其實也不難做到——使用 ThreadLocal,種子用當前執行緒的 Hash code 和當前時間異或一下的結果

5樓:

這方便你在例項化Random的時候,設定不同的種子,生成不同的偽隨機數序列。當然你可能會說沒有這個需求。

你還可以繼承Random類,編寫自己的隨機數生成演算法,如果Random類做成靜態的,你就不能繼承了。當然你依然可能會說沒有這個需求。

接下來這個是不得不了,那就是執行緒安全問題,Random類是放在System命名空間下的,意味著很底層、很輕量,所以它自身沒有實現執行緒安全。不過,我們無法確定這是因還是果。

你可以在應用程式啟動時,例項化乙個全域性可訪問的Random物件作為靜態欄位來使用。從多個執行緒訪問時,可以使用同步物件來確保同一時刻只有乙個執行緒可以訪問這個物件。然後把它們統統封裝進乙個靜態類中。

然後你可能會問,為什麼微軟不從一開始就這樣實現這個Random類呢?

c 為什麼不隱式地定義類靜態成員?

靈劍 跟編譯鏈結過程有關係,像靜態成員這種會在靜態區分配空間的,編譯的時候必須要建立乙個符號,鏈結的時候把不同檔案裡的符號指向同乙個位置,以前必須有乙個檔案是實際分配空間,其它檔案只引用不分配,所以有宣告和定義的區別。現在有弱符號的功能了,就可以實現inline也就是宣告的同時定義了。 因為編譯和鏈...

c 靜態成員函式為什麼不能為虛函式?

Elvis Wang 其實我覺得這個問題沒有回答的必要,屬於語言概念層面的東西。class A 首先你要搞清楚什麼是普通成員函式。成員函式是類例項相關的,不同的例項物件呼叫成員函式結果一般都不同。比如,上面的fun1是成員函式,你進行呼叫 A a1 new A A a2 new A a1 fun1 ...

C 裡,如何在乙個類廠裡,用靜態方式判斷乙個類是否繼承自某個類??

dodoleon 直接用c 11的 std is base of 就可以判斷是否是通過乙個基類繼承下來的。 Certain Y template size t m constexpr auto string equal const char value n const char o m for in...