【问题标题】:Construct a bijective function to map arbitrary integer from [1, n] to [1, n] randomly构造一个双射函数将任意整数从 [1, n] 随机映射到 [1, n]
【发布时间】:2021-07-12 02:38:08
【问题描述】:

我想构造一个双射函数f(k, n, seed),从[1,n][1,n],其中1<=k<=n1<=f(k, n, seed)<=n 对应每个给定的seedn。该函数实际上应该从1,2,...,n随机排列 返回一个值。随机性由seed 决定。不同的seed可能对应不同的排列。对于每个1<=k<=n 和任何给定的seed,我希望函数f(k, n, seed)时间 复杂度为O(1)

任何人都知道我该如何构造这样的函数?允许随机性是伪随机性。 n 可以非常大(例如 >= 1e8)。

【问题讨论】:

  • n 有多大?如果它很小,您可以通过改组 {1,..n} 制造的查找表来实现 f
  • @dmuir n 可以非常大,例如>= 1e8.
  • 您可能正在寻找block cipherThis question 及其答案可能很有趣。
  • stackoverflow.com/q/3910101/270986 的可能重复项?
  • @MarkDickinson 我会检查一下。谢谢!

标签: math random generator permutation bijection


【解决方案1】:

无论你怎么做,你总是需要存储一个仍然可用的号码列表或已经使用的号码......一个简单的可能性是以下

const avail = [1,2,3, ..., n];

let random = new Random(seed)

function f(k,n) {
  let index = random.next(n - k);
  let result = avail[index]
  avail[index] = avail[n-k];
}

对此的假设如下

  • 数组avail是0索引的
  • random.next(x)0 <= i < x 创建一个随机整数i
  • 第一个调用函数fk0
  • f 被称为连续 k 0, 1, 2, 3, ..., n

原理如下:

avail 保存所有仍可用于排列的数字。当您采用随机索引时,该索引处的元素是排列的下一个元素。然后,无需从数组中切出该元素,这非常昂贵,您只需将当前选定的元素替换为 avail 数组中的最后一个元素。在下一次迭代中,您(实际上)通过将随机数的上限减少 1 来将 avail 数组的大小减少 1。

我不确定这种随机排列在值分布方面的安全性如何,例如,某个范围的数字更有可能出现在排列的开头或结尾的排列。

【讨论】:

  • 第三和第四个假设不正确。实际上我需要以k的不同顺序调用f(k, n, seed) ,并为不同的k并行调用许多f(k, n, seed)
  • 好吧,那么唯一的可能就是预先创建排列。
  • 不管你怎么做,你总是需要存储一个仍然可用或已经使用的数字列表:正如问题下的 cmets 所展示的,这不是是的。
【解决方案2】:

一个简单但不是很“随机”的方法是使用这样一个事实:如果 a 与 n 互质(即它们没有公因数),那么

x-> (a*x + b)%n

是 {0,..n-1} 到 {0,..n-1} 的排列。要找到它的倒数,您可以使用扩展欧几里得算法来找到 k 和 l 以便

1 = gcd(a,n) = k*a+l*n

因为上面的地图的倒数是

y -> (k*x + c) mod n
where c = -k*b mod n

因此,您可以选择 a 作为 {0,..n-1} 中与 n 互质的“随机”数,并选择 b 作为 {0,..n-1} 中的任意数

请注意,您需要在 64 位算术中执行此操作以避免计算 a*x 时溢出。

【讨论】:

  • 是的,这种方法不是很“随机”,我已经尝试过,发现即使为a 选择了巨大的素数,生成的序列也会有一些明显的模式。例如,在结果序列中大致周期性地增加 1-100。
  • 如果您对 n 有一定的控制权,可能会有更好的方法可用。例如,如果 n 是 2 的幂,那么将 {1,..n} 中的任何数字拆分为更小的块、置换每个块并重新组合是很简单的。或者,如果 n 有相当数量的因数,也许可以使用中国剩余定理将其分解成块。
猜你喜欢
  • 1970-01-01
  • 2018-02-05
  • 2010-10-24
  • 2011-10-21
  • 1970-01-01
  • 2013-11-17
  • 2021-05-09
  • 1970-01-01
  • 2015-07-15
相关资源
最近更新 更多