2011-07-01 56 views
1

我有2個設備,我正在尋找一種方法來同步它們之間的隨機數生成。同步隨機數

更多背景:2個設備連接,一個設備發送包含數據集合中的其他文件。數據集然後加載到兩個設備上。數據以各種級別隨機顯示。我希望顯示器在設備之間同步,但仍然是隨機的。

的概念性的一例:拍攝照片的堆疊。堆棧的副本被髮送到遠程設備並存儲以備將來使用。然後在兩個設備上以相同的方式對棧進行混洗,以便在每個設備上繪製第一張圖片將產生相同的輸出。這是過分簡化,我的應用程序中需要更多的隨機數,所以優化,如共享排序順序不適用...

打破:我需要一個簡單的方法來從相同的隨機數池在2個設備上。我不知道在設備同步之前可能會出現多少次隨機抽籤,但是一旦同步,應該可以預測,他們將使用相同數量的隨機數,因爲它們使用的是相同的數據集,但是有機會抽取更多在進行下一批處理之前(這將需要隨機數據的重新同步)。

我期待,以避免傳遞排序順序,位置信息等,在數據集中顯示時(這也引起了關注結構性自項目最初並非設計來共享信息已經被傳每個實體),因爲能夠生成相同的位置,這要求隨機數字以相同的順序出現。

任何想法或建議,將不勝感激。

+0

感謝所有的回覆。我最初的嘗試(在兩臺設備上使用相同的種子)都被我沒有追蹤到的東西拋棄,但現在我意識到了,所以只要設置種子就應該工作,一旦我理清什麼是拋出它(我可能是重置它我還沒找到的地方...)。然而,一旦我開始移植這個系統跨平臺,我認爲OscarMk對實施我自己的LCG的建議將成爲最小化操作系統與操作系統不一致等等的方式。感謝所有的答覆! – ima747

+0

我試着完全一樣,有些測試人員報告說有時隨機生成的元素不同步。這非常好,因爲我在使用rand()之後纔開始種子,所以不知道那裏發生了什麼。難道不同的iDevices(或iDevices vs模擬器)有不同的rand()實現嗎? –

回答

8

您可以使用LCG算法,併爲產生相同的種子。由於LCG算法是確定性的,只要您使用相同的種子對兩個設備進行種子處理,它們就會產生完全相同的僞隨機數。

您可以找到LCG算法這裏的更多信息:

Linear congruential generator

這LCG是用於例如通過java.util.Random的。

1

如果你在每個設備上給rand()同樣的種子,即srand(SEED);,那麼出來的(僞)隨機數保證每次都是一樣的,並且你可以保持無限制地將數字拔出而不需要重新播種。

+0

這就是我的想法,但沒有看到結果,但進一步的測試表明,我在其他地方出現了一個小故障,正在拋棄它。 – ima747

1

大多數隨機數發生器讓你設置「種子」。如果您創建兩個隨機數生成器,在兩臺不同的機器上執行完全相同的生成算法(甚至不需要是相同類型或運行相同的操作系統),然後爲兩臺機器提供相同的「種子」值,它們將兩者都產生完全相同的隨機數字序列。

所以你的「同步」應該真的只需要從第一機器傳輸一個數字(通常本身就是一個隨機選擇的號碼)到第二。然後兩臺機器使用與「種子」相同的數字。

(我仰望的iPhone隨機數生成器的細節,但蘋果文檔的網站顯然已經受到明尼蘇達州政府關門。)

0

如果你並不總是要指定的種子,你可以簡單地指定一個設備作爲主設備。當主設備產生一個隨機數時,它向包含該隨機數的另一設備發送消息。

+0

這我相信需要在客戶端保留一個隨機數列表,並從中取出,這意味着主服務器總是必須在客戶端之前生成。在我目前的安排下,沒有指定的主人,這會使事情進一步複雜化。 – ima747