在php中生成至少n个唯一数字的6位长度的随机数

时间:2017-11-30 19:07:22

标签: php

任何人都可以给我实现这个逻辑的想法。我知道如何生成随机数,但却没有知道如何使用至少两个唯一数字

感谢,你。

适用的规则:

所有独特的。
4个独特的和2个重复的数字 3个独特的数字和3个重复的数字 2个独特的和4个重复的数字 需要用以上四个规则形成的数字

规则不适用:

1个唯一且5个重复的数字 0个唯一和6个重复数字。
用这两个规则形成的数字不是必要的

数字可以是这样的:

123456 33 4567, 444 567, 5555 67等。

不允许使用这些组合:

111111 222222 333333 444444 555555 666666 777777 888888 999999

122222 133333 .. .. 199999

222666 666777 等,

将此问题标记为否定且标记为重复的人可以在下面做出评论,指明其解释位置。在发布这个问题之前我进行了很多探索,但没有找到我需要的东西,所以来到这里。希望你们有人帮助我。

1 个答案:

答案 0 :(得分:1)

  

Asker评论:4个唯一和2个重复数字。但他们也应该有3个独特的   和3个重复的数字,2个独特的和4个随机的重复数字   号。

好吧,我想我终于明白了,所以我调整了算法以匹配每个可能的规则,你期望从0到6唯一,虽然因为你会看到我没有改变我原来的答案代码。我甚至添加了一个排序标志,以便对int的incase进行排序,这也是一个要求。我确定!!

<?php
//
function random_number_with_dupe($len = 6, $dup = 1, $sort = false) {
    if ($dup < 1) {
        throw new InvalidArgumentException('Second argument is < 1');
    }        

    $num = range(0,9);
    shuffle($num);

    $num = array_slice($num, 0, ($len-$dup)+1);

    if ($dup > 0) {
        $k = array_rand($num, 1);
        for ($i=0; $i<($dup-1); $i++) {
            $num[] = $num[$k];
        }
    }

    if ($sort) {
        sort($num);
    }

    return implode('', $num);
}

所有独特。

for ($i=0; $i<5; $i++) {
    echo random_number_with_dupe(6, 1, true).PHP_EOL;
}
/*
124579
123679
013568
015789
013578
*/

4个唯一且2个重复的数字。

for ($i=0; $i<5; $i++) {
    echo random_number_with_dupe(6, 2, true).PHP_EOL;
}
/*
235699
037789
034677
012249
033569
*/

3个唯一且3个重复的数字。

for ($i=0; $i<5; $i++) {
    echo random_number_with_dupe(6, 3, true).PHP_EOL;
}
/*
015559
011147
111239
677789
456777
*/

2个唯一且4个重复的数字。

for ($i=0; $i<5; $i++) {
    echo random_number_with_dupe(6, 4, true).PHP_EOL;
}
/*
068888
022229
018888
333378
000058
*/

1个唯一且5个重复的数字。

for ($i=0; $i<5; $i++) {
    echo random_number_with_dupe(6, 5, true).PHP_EOL;
}
/*
788888
066666
799999
355555
244444
*/

0个唯一且6个重复数字。

for ($i=0; $i<5; $i++) {
    echo random_number_with_dupe(6, 6, true).PHP_EOL;
}
/*
888888
333333
777777
888888
777777
*/

所有规则。

for ($i=0; $i<6; $i++) {
    echo random_number_with_dupe(6, $i+1, true).PHP_EOL;
}
/*
345789
003569
245666
000089
777778
555555
*/

所有规则(随机)。

for ($i=0; $i<6; $i++) {
    echo random_number_with_dupe(6, mt_rand(1, 6), true).PHP_EOL;
}
/*
225678
222222
111359
444444
777778
233349
*/

工作示例:

https://3v4l.org/3OCkc

原始

这个怎么样,每个数字都是唯一的。使用0到9作为熵,然后随机播放。

<?php
function random_number($len = 6) {
    $num = range(0,9);
    shuffle($num);
    return implode('', array_slice($num, 0, $len));
}

for ($i=0; $i<10; $i++) {
    echo random_number(6).PHP_EOL;
}

结果:

357964
365870
392576
285196
278915
712960
751032
517420
943257
380162

修改

  

Asker评论:我可以做,但要求不同。他们需要   至少2个唯一数字。 1 重复

<?php
function random_number_with_1_dupe($len = 6) {
    $num = range(0,9);
    shuffle($num);

    $num = array_slice($num, 0, $len-1);

    $dup = array_rand($num, 1);
    $num[] = $num[$dup];

    return implode('', $num);
}

for ($i=0; $i<10; $i++) {
    echo random_number_with_1_dupe(6).PHP_EOL;
}

564795
698756
937414
760897
706383
784626
520166
614055
798057
295809

编辑v4.0

  

我需要一个没有这两个规则的随机数:1个唯一且5个   重复的数字。 0个唯一和6个重复数字。适用规则   :一切都很独特。 4个唯一和2个重复数字。 3独特和3   重复的数字。 2个独特的和4个重复的数字。

第二个参数是规则,所以你要这样做:

echo random_number_with_dupe(6, mt_rand(1, 4), true).PHP_EOL;

如果你想要介于两者之间,你可以定义一个规则数组并随机选择一个。

$rules = [
    1,3,5
];

echo random_number_with_dupe(6, $rules[array_rand($rules)], true);