algorithm - 在小于 O(N) 的时间内生成 N 个准随机数

标签 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不知何故(不是数学家,只是用谷歌搜索了这个词)。

你的想法?

最佳答案

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

关于algorithm - 在小于 O(N) 的时间内生成 N 个准随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10064550/

相关文章:

c++ - 为什么我随机生成的数字输入全零?

java - 假设初始位置是(1, 1),看看你是否可以在每一步通过以下给定的规则到达(x, y)

algorithm - 算法的健全性和完备性

perl - 如何从 Perl 中的数组中获取加权随机选择?

java - 没有两个连续对象相同的随机选择序列

python - 生成总和为 M 的 N 个均匀随机数

找到最佳报价组合的算法,该组合可在给定的一组项目上提供最大折扣

algorithm - 优化参数的类强盗算法?

algorithm - (双向)链表 get() 复杂度

java - 在java中生成14-24之间的100个随机数并放入字节数组中