PHP如何从数组中获取指定数量的随机元素?
问题原因分析
你代码运行不符合预期主要有两个核心问题:
- 输出逻辑和生成数量不匹配:你代码里固定只打印了前2个随机结果,当你设置
$num = 3的时候自然少输出1个值,要是用户输入的生成次数更大,缺失的内容会更多。 array_rand功能不符合骰子生成的需求:array_rand的设计逻辑是从数组中选取不重复的随机键,一方面最多只能生成6个结果,传入大于6的次数会直接报错;另一方面骰子滚动是允许出现重复数值的,完全不符合你的使用场景。
另外你给出的示例里输入4输出包含8属于笔误,1-6范围的骰子不会出现8这个结果。
正确实现代码
推荐直接使用random_int(PHP 7.0及以上版本支持,生成的随机数更安全)循环生成指定次数的1-6随机值,实现代码如下:
<?php if ($argc < 2) { print "You have to write at least one parameter" . PHP_EOL; exit(1); } // 将用户输入的次数转为整数 $num = (int)$argv[1]; // 校验次数合法性 if ($num < 1) { print "生成次数不能小于1" . PHP_EOL; exit(1); } $result = []; for ($i = 0; $i < $num; $i++) { // 生成1到6之间的随机整数 $result[] = random_int(1, 6); } // 用空格拼接结果输出 print implode(' ', $result) . PHP_EOL; ?>
基于array_rand的兼容实现
如果你坚持要使用array_rand函数,需要每次单独调用一次取单个键,循环指定次数,这样才允许出现重复值:
<?php if ($argc < 2) { print "You have to write at least one parameter" . PHP_EOL; exit(1); } $num = (int)$argv[1]; if ($num < 1) { print "生成次数不能小于1" . PHP_EOL; exit(1); } $diceNumbers = [1, 2, 3, 4, 5, 6]; $result = []; for ($i = 0; $i < $num; $i++) { // 每次只取1个随机键,允许重复 $key = array_rand($diceNumbers); $result[] = $diceNumbers[$key]; } print implode(' ', $result) . PHP_EOL; ?>
内容的提问来源于stack exchange,提问作者ninna
相关产品推荐
相关产品推荐

