提问者评论: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
编辑
提问者评论:这个我可以做到,但要求不同。他们需要
至少 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);