根据一系列数字生成伪唯一编号(代码),在4位数内无重复

时间:2015-06-19 21:31:03

标签: php math hash

我生成了一些我不想在至少1000个连续数字内重复的独特代码

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

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

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

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

1 个答案:

答案 0 :(得分:2)

您可以设计一个自定义Linear Congruential Generator来生成随机的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不会。