我正在尝试在php中创建一个类似于系统的刮刮卡,根据随机生成的数字显示赢家或输家。
我知道我可以使用mt_rand或rand创建一个随机数,范围从0到9但我遇到的问题是确保不超过一个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'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"; // :-(
}
回答@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个重复数字
UPDATE
刚尝试了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);