如何制作确定性伪随机排列生成器函数?

Dis*_*pol 1 math

我正在寻找一个输入为 0, 1, 2, 3....N 的函数。其结果应该是相同的输入数组,只是“随机”排列。结果必须是唯一的,因此所有结果都会生成。现在,我知道/不介意对于 0, 1, .... N 的所有列表,将输出相同的结果。这是预期的并且很好,我只是希望结果是输入的洗牌。

我发现这个功能:

function perm( x )
{
    return x * 833 % N;
}
Run Code Online (Sandbox Code Playgroud)

其中 833 可以是任何较大的素数。这会产生不错的结果,但它们总是具有重复的模式。参见 N = 16: 0 3 6 9 12 15 2 5 8 11 14 1 4 7 10 13

想象一下它看起来像 3 个鱼翅。基本上我的问题是,如何制作一个函数来执行我所描述的功能,但进行更混乱的洗牌?

leo*_*loy 5

线性同余算法将始终显示该线性模式。也许你更想要一个分组密码。请参阅此处和此相关问题

你的长度很小,一个更实用的解决方案是预先生成的排列表(正如另一个答案所建议的那样 - 你相当粗鲁地拒绝并被删除)。