首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成一个不超过3个重复数字的9位数字

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

Stack Overflow用户
提问于 2019-03-29 19:38:37
回答 3查看 424关注 0票数 0

我正在尝试创建一个像php中的系统一样的抓取卡,根据随机生成的数字显示胜利者或输家。

我知道我可以使用mt_rand或rand创建一个从0-9范围内的随机数,但我的问题是确保不超过一个重复的3。

9位数字输出时,100%不匹配数字,或9位数字,其中一个数字最多出现3倍于这样2948410427。

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

然后服务器将生成这些数字,然后这些数字将以json格式输出,如下所示

代码语言:javascript
复制
{
    "Theme": "Space",
    "one": 3,
    "two": 6,
    "three": 0,
    "four": 7,
    "five": 1,
    "six": 3,
    "seven": 2,
    "eight": 9,
    "nine": 3,
    "winner": true
}

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

代码语言:javascript
复制
1.png
2.png
3.png

等等,填补划痕的网格。

这是我能想到的最好的方法,也允许随机的主题选择和随机的赢家。

如果其他人能想出更好的办法,我会很高兴听到的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-29 19:56:25

如果您洗牌和切片3次,切片3个值,那么您将得到9个值,而且最多只有3个值:

代码语言:javascript
复制
$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的答案,但有以下更改:

代码语言:javascript
复制
$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:

代码语言:javascript
复制
if($v = array_search(3, array_count_values($result))) {
    echo "You won with $v"; // :-)
} else {
    echo "Loser";           // :-(
}
票数 1
EN

Stack Overflow用户

发布于 2019-03-29 20:58:48

在回答@AbraCadaver之后,您觉得(对不起,我的PHP非常生疏)

代码语言:javascript
复制
$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次左右后)会有一点不同。如果洗牌()的执行质量好的话.

代码语言:javascript
复制
$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);
票数 1
EN

Stack Overflow用户

发布于 2019-03-29 19:59:23

创建一个2 x 0-9范围的基地.

添加一个随机数,然后将它们全部洗牌。

从数组中分割出前九位数字,并加入它们来创建划痕卡。

这意味着它是随机的,如果划痕卡是一张赢牌,它是随机数是3的。

代码语言:javascript
复制
$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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55424476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档