我有一段代码,必须在向量中查找满足给定谓词的第一个元素。我必须多次执行此操作,并且由于有多个元素可以满足我的谓词要求,因此我想对检查顺序进行某种程度的随机化处理,以便使每个人都有被发现的机会。
同时,我希望它表现得尽可能好,所以我真的不想洗牌/分配或任何类似的东西。
这些要求使我陷入了随机数生成,线性同余生成器,LFSR,Xorshifts,加密技术的漩涡中,但是我很难找到一个好的解决方案。
我意识到,真正随机选择一个排列是不可能的。我正在寻找的是可以通过的发电机
image
,它将在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
的范围应该尽可能地公平(因为更改参数会导致重复一些操作排列)。
任何人都可以指出我是否有更好的解决方案,以及如何阅读才能了解更多信息?对于新手来说,这个领域看起来非常复杂,我不知道从哪里开始。