这是受到求职面试中的一个问题的启发:你如何有效地生成N个独特的随机数?他们的安全和分配/偏见并不重要。
我提出了一种天真的方式来调用rand()N次并通过反复试验来消除欺骗,从而得到效率低下且有缺陷的解决方案。然后我读了this SO question,这些算法非常适合获得高质量的唯一数字,它们都是O(N)。
但我怀疑有一些方法可以在低于O(N)时间复杂度的情况下为虚拟任务获得低质量的唯一随机数。我有一些可能的想法:
你的想法?
答案 0 :(得分:6)
据推测,这个例程有某种输出(即结果被写入某种数组)。填充大小为N的数组(或其他一些数据结构)至少是O(N)操作,因此您不能比O(N)做得更好。
答案 1 :(得分:0)
您可以生成一个随机数,如果结果数组包含它,只需添加已生成数字的最大数量。
检测已生成的数字是否为O(1)(使用哈希集)。所以它是O(n)并且只有N random()
次调用。
当然,这是假设我们不会溢出上限(即BigInteger)。