我需要生成大约 9-1 亿个不重复的随机数,范围从零到生成的数字数量,并且我需要它们非常快速地生成。对类似问题的几个答案提出了简单地对数组进行洗牌以获得随机数,而其他答案则提出使用布隆过滤器。问题是,哪一个更有效,如果是布隆过滤器,我该如何使用它?
你根本不需要随机数。您想要的数字恰好是 0 到 N-1,按随机顺序排列。
简单地填充数组并洗牌应该非常快。正确的 Fisher-Yates 洗牌时间复杂度为 O(n),因此在 C 甚至 Java 中,一亿个数组的时间应该远低于一秒,而在 Python 等高级语言中则稍慢一些。
您只需生成 N-1 个随机数即可进行洗牌(如果您使用拒绝采样来获得完美的均匀性,则可能高达 1.3N),因此速度很大程度上取决于您的 RNG 的速度。
您永远不需要查找数字是否已经生成;无论您使用哪种算法,这都会非常慢,尤其是在运行结束时。
如果您需要的总数略少于 N,请将数组从 0 填充到 N-1,然后提前中止洗牌并获取部分结果。仅当您需要的数字量与其范围相比非常小时,您才应考虑生成并检查重复方法。在这种情况下,鲍勃·弗洛伊德的算法可能会很好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)