生成小于O(N)的N个准随机数

时间:2012-04-08 16:51:19

标签: algorithm random

这是受到求职面试中的一个问题的启发:你如何有效地生成N个独特的随机数?他们的安全和分配/偏见并不重要。

我提出了一种天真的方式来调用rand()N次并通过反复试验来消除欺骗,从而得到效率低下且有缺陷的解决方案。然后我读了this SO question,这些算法非常适合获得高质量的唯一数字,它们都是O(N)。

但我怀疑有一些方法可以在低于O(N)时间复杂度的情况下为虚拟任务获得低质量的唯一随机数。我有一些可能的想法:

  • 存储许多预先计算的列表,每个列表包含N个数字,并随机检索一个列表。对于固定的N,复杂度为O(1)。使用的存储空间是O(NR),其中R是列表的数量。
  • 生成N / 2个唯一的随机数,然后将它们除以2个不等的部分(奇数的floor / ceil,偶数的n + 1 / n-1)。我知道这是有缺陷的(重复可以弹出)而O(N / 2)仍然是O(N)。这更令人深思。
  • 生成一个大的随机数,然后通过一些固定的操作(如按位运算,分解,递归,MapReduce或其他方法)从中挤出更多变体。
  • 以某种方式使用quasi-random sequence(不是数学家,只是用Google搜索这个术语)。

你的想法?

2 个答案:

答案 0 :(得分:6)

据推测,这个例程有某种输出(即结果被写入某种数组)。填充大小为N的数组(或其他一些数据结构)至少是O(N)操作,因此您不能比O(N)做得更好。

答案 1 :(得分:0)

您可以生成一个随机数,如果结果数组包含它,只需添加已生成数字的最大数量。

检测已生成的数字是否为O(1)(使用哈希集)。所以它是O(n)并且只有N random()次调用。

当然,这是假设我们不会溢出上限(即BigInteger)。