伪随机选择并在O(1)空间中生成置换

时间:2019-03-30 09:23:30

标签: algorithm random permutation theory lfsr

我有一段代码,必须在向量中查找满足给定谓词的第一个元素。我必须多次执行此操作,并且由于有多个元素可以满足我的谓词要求,因此我想对检查顺序进行某种程度的随机化处理,以便使每个人都有被发现的机会。

同时,我希望它表现得尽可能好,所以我真的不想洗牌/分配或任何类似的东西。

这些要求使我陷入了随机数生成,线性同余生成器,LFSR,Xorshifts,加密技术的漩涡中,但是我很难找到一个好的解决方案。

我意识到,真正随机选择一个排列是不可能的。我正在寻找的是可以通过的发电机

  • image
  • 种子
  • 一些随机位(以从单独的PRNG生成的数字参数的形式)

,它将在N个元素的排列之一(伪随机选择)中循环。

This answer提供了我认为可能是一个很好的起点;

形式的16位生成器
N

哪个人可以遍历丢弃任何数字>N。我喜欢这一点,因为它不需要我找到质数,只需找到下一个2的高次幂即可快速进行位处理。我已经玩过这个游戏,并且有一个生成器

P(x) = ((x ^ 0xf) ^ (x << 2) + 3) & 0xf 

随机选择z和y给我不同的排列。但是,我不完全了解它的工作原理,是否可以改进,以及P(x) = ((x ^ (next_pow2 - 1)) ^ (x << z) + y) & (next_pow2 - 1) y的范围应该尽可能地公平(因为更改参数会导致重复一些操作排列)。

任何人都可以指出我是否有更好的解决方案,以及如何阅读才能了解更多信息?对于新手来说,这个领域看起来非常复杂,我不知道从哪里开始。

0 个答案:

没有答案