2

我有一段代码,我必须在一堆向量中查找满足给定谓词的第一个元素。我必须多次这样做,并且由于有多个元素可以满足我的谓词,我想稍微随机化我检查的顺序,以便让每个人都有公平的机会被发现。

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

这个要求让我陷入了随机数生成、线性同余生成器、LFSR、Xorshifts、密码学的螺旋,但我很难找到一个好的解决方案。

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

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

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

这个答案提供了我认为可能是一个很好的起点;一个 16 位的生成器,形式为

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

哪个可以迭代丢弃任何大于 N 的数字。我喜欢这个,因为它不需要我找到素数,只需要 2 的下一个最高幂,它可以快速进行位摆弄。我玩过这个,我有一个表格的生成器

P(x) = ((x ^ (next_pow2 - 1)) ^ (x << z) + y) & (next_pow2 - 1)

随机选择 z 和 y 给了我不同的排列。但是,我不完全了解它是如何工作的,是否可以改进,以及在什么范围内y应该z尽可能公平(因为更改参数会导致重复一些排列)。

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

4

0 回答 0