【发布时间】:2010-10-18 11:26:18
【问题描述】:
假设我有一个数字序列: {n, n+1, n+2, ... n + m}
在不提前存储数字的情况下,我想创建一个函数 f(),它给定序列 {1,2,3,...m} 将随机(或至少伪随机)顺序。
例如假设我的序列是 {10, 11, 12, 13, 14, 15, 16, 17}
f(1) 可以产生 14 f(2) 可以产生 17 f(3) 可以产生 13 f(4) 可以产生 10 f(5) 可以产生 16 f(6) 可以产生 15 f(7) 可以产生 11 f(8) 可以产生 12在过去的某个时刻,一位同事向我展示了一种能够做到这一点的数学算法,但从那以后,我几乎忘记了它存在的所有内容。我记得你必须事先有序列,并从函数中使用的序列中生成一些常量。对于那些想知道的人,我很遗憾与那位同事失去了联系。
这个question's 的答案看起来接近我想要的,但我不确定这些答案是否允许我提前将输出限制为特定序列。
编辑:
为了澄清一点,我不想存储原始序列或打乱的序列。我想从原始序列中生成一个函数 f()。
令人沮丧的是我已经看到了这个,我只是记不住它,无法用谷歌再次找到它。
Fisher-Yates 算法非常适合置换或洗牌,但这不是我想要的。
【问题讨论】:
-
您能否澄清“不提前存储数字”的意思?如果集合没有存储在某处,函数如何知道有效集合?您的意思是您的集合将始终由起始编号和计数定义吗?还是不应该提前存储随机输出?
-
对“m”有什么限制吗? (例如 2 的幂?素数?)
-
(或保证 m 为“小”如 65536)
-
看看这个维基百科条目:en.wikipedia.org/wiki/Linear_congruential_generator。注意关于生成给你一个完整周期的数字的部分。请注意,对于 m 的某个值(您的序列大小),数学并不适合您生成正确的 LCG。
-
@Jason S:m的大小没有限制。
标签: algorithm language-agnostic math sequence