我有一个问题,我可以使用什么算法在Java中生成一组2^21随机唯一数字? java中除了math.random之外还有另一个生成随机数的库吗?
提前致谢!
关键问题是你所说的“数字”是什么意思?
一般来说,这个问题可以通过“生成一个数字列表,将其按随机顺序排列,取出其中的前 2^21 个”来解决
第一部分很琐碎
第二部分可以通过fisher yates算法解决
真正的问题是如果您想使用非常大的数字空间。那么你需要一个懒惰的解决方案
这是我要做的:
使用数据结构来表示表面看起来像数组的列表,但内部使用基于哈希表的稀疏数组表示形式来表示。此外,如果在尝试从单元格中读取数据时,如果您没有命中哈希值中的某些内容,则只需返回该单元格的索引即可。
您修改后的渔民值停在 2^21 处index
变量并使用随机变量j
之间index
和数组的“长度”(整数的数量)
这种惰性方法会在 O(n) 时间和 O(n) 空间中生成任何类型数字的随机非重复列表,其中 n 是您尝试生成的数组的长度。这是你能做的最好的事情了。
关于 Fisher-Yates 的解释http://en.wikipedia.org/wiki/Fisher-Yates_shuffle http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)