2013-10-02 82 views
0

我想要一個僞隨機數據源,我可以通過索引查看;我的特殊使用案例是播放列表的隨機播放,我希望能夠回放到較早的歌曲,而無需存儲首先播放歌曲的順序。大多數RNG使用一個狀態進行工作,每個新的隨機數字都被生成,並且以前的狀態不容易檢索。基於隨機種子的散列函數輸出的隨機程度如何?

現在我有這個想法:使用種子,如果種子,並從它計算哈希代碼。在哈希碼中的位用完之後,增加種子,然後計算下一個哈希值。由於種子只能被可逆地修改,因此可以檢索較舊的散列碼並因此「隨機」位。

現在我的實際問題:從理論的角度來看,這是多麼隨意?對音樂播放列表來說並不重要,但我仍然對它感興趣。我也可以想象電腦遊戲應用的公平性會成爲問題。

顯然,沒有太多的熵涉及,但(密碼)散列函數應該有一個單一位的變化完全不同的輸出。我可以通過對種子進行一些其他的可逆操作來提高隨機性嗎?

+1

http://security.stackexchange.com/上的人可能更能回答關於哈希的任何事情。但總的來說,良好的哈希被構造爲均等分佈,以便只是輸入中的小改動會產生非常不同的哈希。所以我想你可以說你沒事的只是增加一個。 – poke

回答

1

好主意。如果你想產生大量的隨機數,也許有點矯枉過正。

如果結果真的是「隨機」取決於您使用的加密算法。好的方面(SHA,...)會給出一個平均分配的結果。平等分配是這種算法的要求之一。

請記住,加密/哈希算法更復雜,然後隨機數發生器。因此產生這種數量的massiv數量將是一個問題。這可能會影響遊戲,可能不會產生播放列表。

順便說一句:你見過Collections.shuffle()。它可能會緩解你的生活。

+0

感謝您的評論!我知道這不是性能方面的最佳主意,但正如你所說,我的用例可以忽略不計。另外,當我談論遊戲的時候,我主要關注的是基於回合的遊戲,其中大部分是紙牌遊戲。我知道Collections.shuffle(),儘管我不認爲這是真正重要的問題。當然,對於播放列表用例,在重複之前播放所有歌曲可能是有意義的。雖然,即使這樣,你需要一種方法來取消播放列表,或將排列與實際播放列表分開......無論如何,這是OT;) –