我生成了一些我不想在至少1000个连续数字内重复的独特代码
这是我的功能。取一个数字乘以另一个数字,然后取小数点前的最后$length=5
个数字
function createPseudoUniqueString($input,$length)
{
return substr( intval($input*738510.93067),-$length) ;
}
有没有办法验证除了测试所有可能性之外,结果数字不会重复?
是否有另一种已知不会重复的替代方案
答案 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不会。