生成一个9位数的数字,其中不超过3个重复的数字

时间:2019-03-29 19:38:38

标签: php random scratchcard

我正在尝试在php中创建类似于刮刮卡的系统,以根据随机生成的数字显示赢家或输家。

我知道我可以使用mt_rand或rand创建0-9的随机数,但是我遇到的问题是确保不超过3个重复项

输出的9位数字中100%没有匹配的数字,或者9位数字中的一个数字最多显示3次,例如2948410427

我这样做的原因是,我有很多主题卡,每个主题都有10个小图标,这些图标编号为0-9,网络用户打开我的应用程序后,它将随机选择一个主题,然后向发送请求我的服务器具有此主题

然后服务器将生成数字,然后将这些数字以json的形式输出

{
    "Theme": "Space",
    "one": 3,
    "two": 6,
    "three": 0,
    "four": 7,
    "five": 1,
    "six": 3,
    "seven": 2,
    "eight": 9,
    "nine": 3,
    "winner": true
}

然后我的应用程序将使用这些数字链接到图像

1.png
2.png
3.png

以此类推,以填充划痕的网格。

这是我认为最好的方法,同时还允许随机选择主题和随机赢家。

如果其他人能想到更好的方法,我将很高兴听到。

3 个答案:

答案 0 :(得分:1)

如果将随机播放和切片3次,切片3个值,那么您将获得9个值,并且最多只能有3个值:

$array = range(1, 9);
$keys  = array('one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine');

shuffle($array);
$result = array_slice($array, 0, 3);
shuffle($array);
$result = array_merge($result, array_slice($array, 0, 3));
shuffle($array);
$result = array_merge($result, array_slice($array, 0, 3));

$result = array_combine($keys, $result);

我喜欢Severin Pappadeux's答案,但作了以下更改:

$array = array_merge($r = range(1, 9), $r, $r);
$keys  = array('one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine');
shuffle($array);
$result = array_combine($keys, array_slice($array, 0, 9));

要检查3个相同的值,请对这些值进行计数并搜索3:

if($v = array_search(3, array_count_values($result))) {
    echo "You won with $v"; // :-)
} else {
    echo "Loser";           // :-(
}

答案 1 :(得分:1)

以下@AbraCadaver的答案如何(对不起,我的PHP非常生锈)

$src  = array_merge($r=range(1, 9), $r, $r); /* 123456789123456789123456789 */
$keys = array('one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine');

shuffle($src);
$result = array_slice($src, 0, 9);

$result = array_combine($keys, $result);

所有组合都将被允许并以最多3个重复数字平均分配

更新

仅在http://phptester.net版本上尝试过,该版本的初始数组有些不同,结果(在按测试按钮50次左右之后)可见一些不同。如果shuffle()实现的质量很好,就很好玩...

$src = array_merge(range(1, 9), range(9, 1, -1), range(1, 9)); /* 123456789987654321123456789 */
print_r($src);
shuffle($src);
$result = array_slice($src, 0, 9);
print_r($result);

答案 2 :(得分:0)

创建2 x [0-9]范围的基准。
添加一个随机数,然后将其全部洗牌。

从数组中切出前九位数字,并加入它们以创建刮刮卡。

这意味着如果刮刮卡是中奖卡,这是随机的,而随机数是3则是随机的。

$base = array_merge(range(0,9), range(0,9));
$winning_number = [mt_rand(0,9)];

$all_numbers = array_merge($base, $winning_number);
shuffle($all_numbers);

$scratch_card = array_slice($all_numbers, 0,9);

echo join($scratch_card);

https://3v4l.org/NjItR