Random 非重复随机数

Random 非重复随机数,random,shuffle,bloom-filter,non-repetitive,Random,Shuffle,Bloom Filter,Non Repetitive,我需要生成大约9-1亿个不重复的随机数,从零到生成的数字数量不等,我需要快速生成它们。对类似问题的一些回答建议简单地对数组进行洗牌以获得随机数,其他人则建议使用bloom过滤器。问题是,哪一个更有效,如果是布卢姆过滤器,我该如何使用它?你根本不想要随机数。你想要的正是0到N-1的数字,以随机顺序排列 简单地填充数组和洗牌应该很快。一个合适的Fisher-Yates shuffle是O(n),因此在C甚至Java中,一个1亿的数组应该需要不到一秒钟的时间,而在更高级的语言(如Python)中则需要

我需要生成大约9-1亿个不重复的随机数,从零到生成的数字数量不等,我需要快速生成它们。对类似问题的一些回答建议简单地对数组进行洗牌以获得随机数,其他人则建议使用bloom过滤器。问题是,哪一个更有效,如果是布卢姆过滤器,我该如何使用它?

你根本不想要随机数。你想要的正是0到N-1的数字,以随机顺序排列

简单地填充数组和洗牌应该很快。一个合适的Fisher-Yates shuffle是O(n),因此在C甚至Java中,一个1亿的数组应该需要不到一秒钟的时间,而在更高级的语言(如Python)中则需要稍微慢一点

你只需要生成N-1个随机数就可以进行洗牌(如果你使用拒绝采样来获得完美的均匀性,可能会达到1.3N),因此速度在很大程度上取决于你的RNG有多快

您永远不需要查看是否已经生成了一个数字;无论您使用哪种算法,这都会非常缓慢,尤其是在运行结束时


如果您需要的总数略少于N,请将数组从0填充到N-1,然后提前中止洗牌并获取部分结果。只有当您需要的数量与它们的范围相比非常小时,才应该考虑生成和检查DUPS方法。在这种情况下,Bob Floyd的算法可能是好的。

作为替代,您可以使用大小适当的块密码。使用块密码对数字0、1、2、。。。你会得到一系列不重复的随机数。确切的序列取决于您使用的键。它们保证不会重复,因为块密码是可逆置换


对于64位数字使用,对于32位使用(允许大范围的块大小)或编写自己的简单代码。假设安全性不是这个问题的大问题,那么就可以自己写了。

没有实际数字就无法回答这个问题。你需要多少随机数,什么类型,什么范围,还有什么其他的限制你没有提到?“真的很大”是没有意义的。你的意思是超过内存容量吗?我需要大约9-1亿个随机数,从零到生成的数字数量不等,这意味着内存不是一个很大的问题,但我真的需要一个高效的算法,而且我不确定存储生成的数字,然后检查它们是否已经存在于存储中需要花费多少时间,正如ROOt_R3z所建议的那样。谢谢你的评论,它们需要多随机?安全是一个问题吗?