我有一个名为rndgen()的函数生成随机的6位数字,即使从数字的开头到处都可以有零位数。
示例:
267809
671485
200000
037481
000005
000437
500005
777777
我不想生成000024或240000或000005或140000或500005或999999等数字,并且允许生成数字,例如000124或245000或000555或145000或511005或999887。 < / p>
不允许使用相同数字的所有数字
如果超过三位数是零的开头或结尾或者数字中间的三位数以上,我该如何检查这个数字,它会生成一个新数字,但如果零位于开头或结尾,lower或none可以使用相同的数字(BY PHP)?
我想要的规则:
生成数字后&gt;
IF( 数字在开始或结束时超过三个零
OR
整个数字都有相同的数字
OR
在数字开头或结尾处的数字超过三个相同的数字
OR
数字中位数超过三个零
)
{CALL AGAIN rndgen()生成新的随机数6个数字}
感谢
答案 0 :(得分:1)
使用算术:
function rndgen() {
do {
$n = mt_rand(100, 999899);
} while ( !($n/100%1111 && $n%1e4%1111 && $n%1e5 > 9) );
return sprintf("%06d", $n);
}
echo rndgen();
关于数字范围100,999899:需要排除所有低于100的数字,因为它们都返回4个前导零:0000xx,并且所有大于999899的数字也需要排除,因为它们所有人都有4个领先9:9999xx
关于条件:
$n/100%1111
:将数十个单位移到小数部分并计算1111模数。例如:
$n 123456 444412 124444 100002
$n/100 1234.56 4444.12 1244.44 1000.02
%1111 123 0 133 1000
$n%1e4%1111
:删除数十万并计算1111模数。例如:
$n 123456 444412 124444 100002
$n%1e4 3456 4412 4444 2
%1111 123 1079 0 2
$n%1e5 > 9
:计算100000模数并检查它是否大于9. ex:
$n 123456 444412 124444 100002
$n%1e5 23456 44412 4444 2
> 9 true true true false
答案 1 :(得分:1)
似乎你想拒绝拥有以下内容的数字:
您可以在preg_match
函数调用中使用以下正则表达式:
^(\d)\1\1\1|(\d)\2\2\2$|0000
如果匹配,那么你有一个应该被拒绝的号码。
以下是测试多个数字的代码:
$tests = array(
"000024", "241111", "222225", "143333", "500005", "999999",
"000124", "245111", "222555", "145333", "544445", "799997"
);
foreach($tests as $num) {
$reject = preg_match("~^(\d)\\1\\1\\1|(\d)\\2\\2\\2$|0000~", $num);
echo "$num: " . ($reject ? "Not OK" : "OK") . "\n";
}
前6个将打印为“Not OK”,另外6个打印为“OK”。
您的rndgen
函数可以使用如下:
function rndgen() {
do {
$num = sprintf('%06d', mt_rand(100, 999989));
} while (preg_match("~^(\d)\\1\\1\\1|(\d)\\2\\2\\2$|0000~", $num));
return $num;
}