0

我想要一个可以通过索引查看的伪随机位源;我的特定用例是播放列表的随机重播,我希望能够倒退到较早的歌曲,而无需存储歌曲最初播放的顺序。大多数 RNG 使用的状态会随着生成的每个新随机数而修改,并且之前的状态不容易检索。

现在我有了这个想法:使用某种种子,并从中计算哈希码。在哈希码中的位用完后,增加种子,并计算下一个哈希。由于种子仅被可逆地修改,因此可以检索较旧的哈希码,因此可以检索“随机”位。

现在我的实际问题是:从理论的角度来看,这有多随机?这对于音乐播放列表来说并不重要,但我仍然对它感兴趣。我还可以想象需要考虑公平性的计算机游戏应用程序。

显然,没有涉及太多熵,但是(加密)散列函数应该在单个位的变化上具有完全不同的输出。我可以通过对种子进行一些其他可逆操作而不是增加一来提高随机性吗?

4

1 回答 1

2

好主意。如果您想生成大量随机数,可能有点矫枉过正。

结果是否真的“随机”取决于您使用的加密算法。Good once (SHA, ...) 将给出具有均等分布的结果。均匀分布是此类算法的要求之一。

请记住,加密/哈希算法比随机数生成器要复杂得多。因此,产生大量此类数字将是一个问题。这可能会影响游戏,生成播放列表可能没有问题。

顺便说一句:你见过Collections.shuffle()。它可能会让你的生活变得轻松。

于 2013-10-02T09:15:24.627 回答