这是受求职面试中一个问题的启发:如何有效地生成 N 个唯一随机数?他们的安全性和分布/偏见并不重要。
我提出了一种调用 rand() N 次并通过反复试验消除欺骗的幼稚方法,从而得到低效且有缺陷的解决方案。然后我读了这个 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 或其他方法)从中挤出更多变体。
- 以某种方式使用准随机序列(不是数学家,只是在谷歌上搜索了这个术语)。
你的想法?