【问题标题】:how can I generate a random 6 digits number with this rule? BY PHP如何使用此规则生成随机的 6 位数字?通过 PHP
【发布时间】:2017-10-22 18:04:14
【问题描述】:

我有一个名为 rndgen() 的函数生成随机 6 位数字,即使数字开头也可以在任何地方都有零位。

示例:

267809

671485

200000

037481

000005

000437

500005

777777

我不想生成像 000024 或 240000 或 000005 或 140000 或 500005 或 999999 这样的数字,并且允许生成像 000124 或 245000 或 000555 或 145000 或 511005 或 999887 这样的数字。

不允许所有具有相同数字的数字

如果零的开头或结尾超过三个数字或数字中间的零超过三个,我如何检查这个数字,它会生成一个新数字,但如果零在开头或结尾, 较低或没有可以使用相同的数字(BY PHP)?

我想要的规则:

生成号码后>

如果 ( 数字的开头或结尾有超过三个零

所有数字都有相同的数字

数字在数字的开头或结尾有超过三个相同的数字

数字的中间有三个以上的零

)

{ 再次调用 rndgen() 生成新的随机 6 位数字}

谢谢

【问题讨论】:

  • 什么?你能举一些例子吗?数字下方的部分不清楚(至少对我来说)
  • 为什么是 999999?排除这个的规则是什么?是否允许 505000?
  • 你应该发布你需要的规则
  • 如果不允许999999,是否允许888888?
  • @Casimir et Hippolyte。是的,505000 是允许的

标签: php random match preg-match


【解决方案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;
}

【讨论】:

  • 感谢您的回答,非常有用。 我应该如何为 4 位随机数编辑此代码??? 拒绝具有以下特征的数字:一个数字重复超过 2 次而在数字的任一端没有中断,或者:一个零重复更多超过 2 次在号码中的任何地方都没有中断
  • 我是这样编辑的:preg_match("~^(\d)\\1\\1|(\d)\\2\\2$|00~", $num); 正确吗?
【解决方案2】:

使用算术:

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。例如:

$n                       123456        444412       124444      100002
$n%1e5                    23456         44412         4444           2
> 9                        true          true         true       false  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 2013-02-28
    相关资源
    最近更新 更多