在O(1)空间中生成从1到n的无重复的随机数

时间:2018-06-11 18:36:58

标签: algorithm data-structures

一种方法是使用大小为n的数组a[i]=i

现在改变它。

然后使用循环打印数字。但是可以不使用数组吗?

Ps:请不要使用任何内置的随机生成器功能。我试图得到一个合乎逻辑的答案并自己编写随机函数。

2 个答案:

答案 0 :(得分:1)

我说这取决于您想要获得的随机数的质量。

极端情况是输出身份置换并声称它是随机的。好吧,他们根本不是随便看。

稍微更合理的解决方案是采用一些素数p > n和一些整数a > 1这是一个原始根模p,然后查看a mod p,{{ 1}},a^2 mod p,...,a^3 mod p。这将是数字a^{p-2} mod p2,...,3的排列。丢弃大于p - 1的所有内容,然后输出其余内容。 (并以某种方式将丢失的n插入随机位置。)所有这些都可以在O(1)附加内存中完成,方法是反复执行1并在运行中丢弃元素x -> (x*a) mod p。对于某些应用来说,结果可能是随机的:正确选择> n,对于未经训练的人眼来说,它至少看起来很随机。不过,还不止于此。

为了获得高质量的随机数,我怀疑有一个使用O(1)额外内存的通用解决方案。但是不要接受我的话。让我们看看其他答案可能会带来什么。

答案 1 :(得分:0)

这个答案是基于python的,但你可以与你喜欢的任何其他编程语言联系起来。

import random # using random class
some_num = _ # any number
sample_num = _ # this should be less than or equal some_num
for num in random.sample(range(some_num), sample_num):
    print(num)

这会生成随机数并使用循环打印它们。