在一个范围内生成不同的随机数
Generate different random numbers within a range
我想在 1 到 N 之间生成 n 个不同的数字(当然是 n<=N)。N 可能非常大。如果n非常小,一种有效的方法是生成一个数字并将其与我们必须确保它是一个新数字的集合进行比较。它需要 O(n^2) 时间和 O(n) 内存。如果 n 非常大,我们可以使用 Fisher-Yates 洗牌算法来生成一个随机排列(n 步后停止)。这需要 O(n) 时间,但我们也必须使用 O(N) 内存。
这是个问题。如果我们不知道n有多大,我们该怎么办?我希望算法只使用 O(n) 内存并在 O(n) 时间后停止。这可能吗?
你基本上可以做与非常小的n相同的操作,但只是使该检查更有效。例如,检查您是否已经生成了一个数字的天真方法是线性搜索以前生成的值列表。对于未知 n,您可以保持以前生成的值集的排序,以便您可以使用更有效的搜索来识别重复项。使用朴素方法,算法需要 O(n 2) 时间,但通过先前结果进行更智能的搜索可以将其减少到 O(n*log2 n)。
相关文章:
- 在一定范围内生成随机数,其中一定百分比为特定值
- 在一定范围内C++生成随机数
- 从大范围内生成一个随机数,但从大范围的中间开始生成较小的范围
- 如何在范围内生成随机数
- 在一定范围内生成随机数
- 如何使用Linux GetRandom系统调用来在范围内生成一个随机数
- 如何在由C++中的负值和正值组成的范围内生成随机数
- 十进制 在包括负数的范围内生成随机数
- 在一个范围内生成不同的随机数
- 浮点数或整数范围内的随机数
- C++11范围内的随机数和显式相似性
- 创建一个函数以返回指定范围内的随机数
- 在c++中生成范围内均匀分布的随机数
- 范围内的随机数(每次运行后范围变化)
- 某个范围内的随机数c++
- 在给定'getrand100()'函数的情况下获取特定范围内的随机数
- 如何使用GMP生成一定范围内的随机数
- 在[0.n-1]范围内生成m个不同的随机数
- C++排除范围内的随机数
- 快速、安全地确定范围内的随机数