根据 4 位数字内没有重复的数字序列生成伪唯一数字(代码)


generating a pseudo unique number(code) based on a sequence of numbers with no repetition within 4 digits

我正在生成一个有点独特的代码,我不想在至少 1000 个连续数字中重复

这是我的函数。 取一个数字乘以另一个数字,然后取小数点前的最后$length=5位数字

function createPseudoUniqueString($input,$length)
{
    return substr( intval($input*738510.93067),-$length) ;
}

除了测试所有可能性之外,有没有办法验证结果数字不会重复?

是否有另一种已知不会重复的替代方案

您可以设计一个自定义线性同余生成器,该生成器生成随机的 5 位数字,并保证在生成所有数字之前不会重复。

LCG 使用以下公式生成随机数:

Xn+1 = ((Xn * a) + c) mod m

要生成 5 位数字,m 应为 100000(范围为 0-99999)。

要保证没有重复("完整句点"),您必须使用以下条件为 a 和 c 选择值:

c 和 m 是相对素数

a - 1 可被 m 的所有素因数整除

如果 m 是 4 的倍数

,则 a - 1 是 4 的倍数。

100000 的质因数是 2 和 5,它也可以被 4 整除,因此 20 + 1 的任何倍数都可以作为 a 的合适值,注意不要将其设置得太大以避免整数溢出。对于 c,只需选择一个相当大的质数。

例如:m = 100000, a = 4781, c = 62873

为 x 设置一个初始种子值,然后使用 $x = (($x*4781)+62873)%100000; 从前一个值生成每个值

请注意,您不能只使用周期较大的随机数生成器,然后将生成的值修改为 100000,因为即使来自较大周期 RNG 的原始生成数字不重复,也不能保证数字 mod 100K 不会。