在一个范围内生成不同的随机数

Generate different random numbers within a range

本文关键字:随机数 范围内 一个      更新时间:2023-10-16

我想在 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)。