如何生成随机代码/ PIN。我读了PHP的 rand()和 mt_rand()函数,它似乎做得很好,但我发现有重复。
有人可以建议或演示在PHP中实现这一目标的更好方法吗?
我的代码:
$size = 1000; //handcoded pin-size
function generatePIN($size =500){
$pins = array(); $i = 0; //ini counter
//my basic algorithm for generating unique pin codes
while ($i < $size){
$pin = (mt_rand(100000,999999));
$pins[] = $pin;
++$i;
}
sort($pins);//sort in lowest to highest
return array_unique($pins);//remove duplicates
}
//call it and print or store in database
$pins = generatePIN($size);
foreach ($pins as $pin) {
echo $pin.'<br>';
}
谢谢。
答案 0 :(得分:0)
真正的随机总是有机会创建副本,因为它对先前给定的randoms是无条件的。
为了减少重复次数,您可以使用mt_rand(10000000,99999999)
增加随机间隔。
或者您可以检查您的号码是否重复:
while ($i < $size){
$pin = (mt_rand(100000,999999));
if (array_search($pin, $pins) === FALSE) {
$pins[] = $pin;
++$i;
}
}
与随机区间相比,较大的$size
表现较差,如果$size
大于它,则会创建无限循环。
答案 1 :(得分:0)
在循环中添加生成的值解决了问题是每天调用它非常有效。无论大小多长。
$size = 1000; //handcoded value
function generatePIN($size =500){
$pins = array(); $i = 0;
//my basic algorithm for generating unique pin codes
while ($i < $size){
$pin = (mt_rand(100000,999999)) + (mt_rand(1000,9999)) + strtotime(date('Y-m-d', strtotime('+'.$i.' week')));
$pins[] = $pin;
++$i;
}
sort($pins);//sort in lowest to highest
return array_unique($pins);//remove duplicates
}
//store in database or print it
$pins = generatePIN($size);
foreach ($pins as $pin) {
echo $pin.'<br>';
}
echo "<hr />";
echo count($pins);