我一直在閱讀遊戲編碼完成(第4版)和我有幾個問題,理解「僞隨機遍歷一組」路徑在「抓包袋有用的東西」在第三章第3節Psuedo隨機遍歷一組
你有沒有想過如何在‘你的CD播放機隨機作品’按鈕?它會隨機播放CD上的每首歌曲,而不會播放同一首歌曲兩次。這是一個非常有用的解決方案,可以確保遊戲中的玩家在有機會再次看到相同的遊戲之前,看到最多種類的功能,例如對象,效果或角色。
在描述之後,它繼續討論我試圖用Java實現的C++實現,但一直無法成功複製。它也簡要描述了它是如何工作的,但我也不明白。
我找到了this StackOverflow對類似問題的回答,但不幸的是,答案中的示例鏈接已死亡,我也不理解維基百科文章,儘管關於它所做的描述似乎描述了我尋找。
要清楚,我是而不是正在尋找一種隨機重新排序集合的方式。我正在尋找一種方法在重複之前從集合中隨機選擇一個元素。
有人可以解釋這種行爲是如何工作的並在Java中提供一個例子嗎?謝謝!
[編輯]我想這可能是有用的,在這裏有一個執行摘錄來幫助解釋我在說什麼。
這是它的工作原理。通過選擇三個大於零的隨機值來計算跳過值。這些值成爲二次係數,和域值(x)被設定爲所述組的順序值:
Skip = RandomA * (members * members) + (RandomB * members) + RandomC
武裝與此跳過值,則可以使用這一段代碼遍歷整個集合恰好一次,以僞隨機順序:
nextMember += skip;
nextMember %= prime;
跳躍的值是如此比你的組所選擇的val的成員的數目大得多你似乎隨意跳過。當然,這段代碼是在一個while循環中,以便捕獲所選值大於您的集合但仍小於素數的情況。
所以你想要隨機順序的項目,但不重新排序。請問爲什麼? – Baz 2012-08-01 19:01:17
我試圖理解本書的例子。另外,如果我理解了正確的事情,那麼更大的N代表洗牌N個對象的集合將會更加昂貴。 – exodrifter 2012-08-01 19:26:53
@Baz假設您的數據是一個有意義的順序列表,但其成員沒有自然順序(從迭代器的角度來看),您不希望爲了提供隨機播放模式而丟失該順序。 – Bobulous 2012-08-01 19:28:04