【发布时间】:2012-04-08 16:51:19
【问题描述】:
这是受求职面试中一个问题的启发:您如何有效地生成 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(不是数学专家,只是用谷歌搜索了这个词)。
你的想法?
【问题讨论】:
-
他们是抱怨您的解决方案的大 O 复杂性太高,还是只是效率太低?因为有比试错法更有效的方法来生成给定范围内的唯一数字。此外,您的解决方案不是 O(n) 最坏的情况 - 要从 n 生成 n 的随机排列,由于所需的重试次数,它将在 O(n^2) 时间内运行。