假设我们有一个整数[a,b]的间隔。我想拥有一个函数,可以在不重复的情况下从间隔内返回随机成员。一旦探索了间隔内的所有成员,就会以相同的顺序再次开始再次返回相同的第一随机序列。

示例:a= 1,b= 5

3, 1, 4, 5, 2, 3, 1, 4, 5, 2, 3, 1, 4, 5, 2, ...
.

通过在A和B之间的所有元素的阵列进行破坏,并且一旦阵列完成,可以易于实现。但是,这将需要太多的内存空间,这不适合我的情况(我可能有数百万个元素)。

相反,我希望的函数将更多或更少:

f(a, b, n, seed) -> n+1
.

其中:

a - start of interval
b - end of interval
n - last element returned from list
seed - self-explanatory
n+1 - next random element from list, calculated by using the seed and the last element returned (n)
.

技巧是知道某种方式,只有在基于以前返回的元素和种子的元素上只能从间隔内获得非重复数字。最后,它会表现出在其初始化时随机化的循环列表,但不使用内存空间。

有帮助吗?

解决方案

我建议您在范围 $ [a,b] $ ,即双角函数上$ \ pi:[a,b] \到[a,b] $ 。然后,保持一个计数器 $ i $ ,它从 $ i= $ ;在每个步骤中,输出 $ \ pi(i)$ ,然后递增 $ i $ (周围环绕其中 $ b + 1 $ 变为 $ a $ )。

有标准方法可以在密码文献中生成这种随机排列:查找保留格式保存加密。种子是加密键。您将能够计算 $ \ pi(i)$ $ o(1)$ 时间和 $ o(1)$ 空格,因此这应该非常有效,避免需要大量存储。

如果您坚持下一个输出应该是上一个输出的函数,可以让 $ g(i)= i + 1 $ (<跨越类=“math-container”> $ g(b)= $ ),然后让 $ f(i)=pi ^ { - 1}(g (\ pi(i))$ ,其中 $ \ pi $ 是如上所选择的随机排列。然后,这将为您提供一个迭代的随机周期通过 $ [a,b] $ 以随机顺序的元素。输出是序列 $ f(a) ,f(f(a)),f(f(f(a))),\ dots $

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top