簡體   English   中英

在C#中,如何獨立保證兩台計算機不會凈生成相同的隨機數?

[英]in c#, how to independently guarantee that two machines will not net generate the same random number?

假設兩台機器正在運行相同的代碼,但是您希望抵消運行代碼的時間,以使它們不可能同時運行,而我的意思是不在5秒內運行。

在開始運行代碼之前,可以生成隨機的秒數,但是可以生成相同的秒數。

是否有一種算法可以獨立保證不同的隨機數?

為了確保應用程序不會同時運行,您需要在兩者之間進行某種形式的通信。 這就像設置某個配置值以在特定時間運行(或延遲設置的秒數(如果可以保證它們將同時啟動))一樣簡單。 或者,可能需要調用數據庫(或類似數據庫)來確定何時啟動。

聽起來您正在尋找調度程序。 您需要第三個服務(調度程序),該服務在應啟動/允許啟動應用程序時維護。 我會避免讓應用程序直接相互通信,因為隨着您的需求變得越來越復雜(這將增加第二台計算機,另一個程序必須遵循類似的調度規則,等等),這將成為一場噩夢。

讓程序向調度服務發送唯一的東西(計算機的MAC地址,僅生成一次並存儲在配置文件中的GUID等),並使其響應該程序多少秒(如果有)必須等待開始其主要執行循環。 或更好的辦法是,在兩台計算機上都賦予調度程序權限以在指定的時間運行程序。

但是,您不能完全孤立地執行此操作-假設您有一個程序唯一決定等待5秒,另一個程序等待7秒-但是當程序2的計數器在程序1之前2秒啟動時會發生什么? 調度程序可以為您解決這個問題。

正如評論/其他答案中指出的那樣,當獨立並行運行時,真正的隨機性無法真正保證落入特定范圍。

假設您的目標是不同時運行多個進程,則可以強制每台計算機選擇不同的時隙來運行該進程。

如果您可以在當前時間與該機器的“索引”之間獲得共識,那么您可以在選定的時隙中運行程序,並可能隨時間間隔隨機偏移。

即使用時間服務來同步時間(對於幾乎連接到幾乎任何網絡的計算機,大多數OS的默認行為),然后將順序ID預先分配給計算機(並獲得有關總數的信息)。 比讓具有ID的機器在類似的時隙中運行(假設計數<60,否則根據計數調整啟動時間;提供足夠的時間以避免在時間同步間隔之間發生小的時間漂移​​時出現重疊)

(start of an hour + (ID*minutes) + random_offset (0,30 seconds))

這樣,機器之間就不需要通信了。

讓兩個應用都讀取本地配置文件,等待指定的秒數,然后開始運行。

將0放入一個,將6+放入另一個。 它們不會在彼此之間的5秒內啟動。 (根據需要調整6+以適應機器負載,速度等的變化。)

並不是真正的算法,但是您可以創建兩個完全不同的數字數組,然后在應用啟動之前(隨機)從該數組中獲取一個數字。

他們同時跑步會受到什么處罰?

我問的原因是,即使您偏移了開始時間,也可以在另一個完成之前開始。 如果他們處理的數據增長,那么隨着時間的流逝和5s規則變得過時的可能性就更大。

如果他們使用相同的資源,那么最好以某種方式使用這些資源來告訴您。 例如,在數據庫中設置一個標志,或者檢查是否有足夠的內存可運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM