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



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

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

9 位数字输出,100% 没有匹配的数字或 9 位数字,一个数字最多出现 3 次,就像这样2948410427

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

然后服务器将生成数字,然后这些数字将以 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 次,切片 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的回答,有以下变化:

$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";           // :-(
}

以下@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 x [0-9] 范围的基础。
添加一个随机数,然后将它们全部洗牌。

从数组中切出前九位数字并将它们连接起来以创建刮刮卡。

这意味着刮刮卡是获胜卡是随机的,而三的数字是随机的。

$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

最新更新