如何使用此规则生成随机的6位数字?通过PHP

时间:2017-10-22 18:04:15

标签: php random match preg-match

我有一个名为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个数字}

感谢

2 个答案:

答案 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)

似乎你想拒绝拥有以下内容的数字:

  • 一个数字重复超过3次而不会在数字的任何一端中断,或者:
  • 零重复超过3次而不会中断任何数字。

您可以在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;
}