如何生成无重复且无连续数字序列的4位随机PIN码?
生成无重复且无连续数字的4位PIN码解决方案
原代码仅实现了无重复数字的功能,但未校验数字间是否存在连续序列(如1和2、3和2这类差值为1的情况)。以下是修改后的代码,可同时满足无重复和无连续数字两个要求:
function randomUniqueNonConsecutivePin() { do { // 生成1-9的无重复4位数字数组 $numbers = range(1, 9); shuffle($numbers); $pinArray = array_slice($numbers, 0, 4); // 检查序列中是否存在连续数字 $hasConsecutive = false; for ($i = 0; $i < 3; $i++) { if (abs($pinArray[$i] - $pinArray[$i+1]) === 1) { $hasConsecutive = true; break; } } } while ($hasConsecutive); // 将数组转为4位数字字符串 return implode('', $pinArray); } // 生成并输出符合要求的PIN码 $validPin = randomUniqueNonConsecutivePin(); echo $validPin;
代码逻辑说明
- 使用
do-while循环:只要生成的序列存在连续数字,就重新生成,直到得到符合要求的结果 - 连续数字判断:通过
abs($pinArray[$i] - $pinArray[$i+1]) === 1校验相邻数字的差值绝对值是否为1,覆盖正序和逆序的连续情况(如2和3、3和2) - 字符串转换:用
implode()替代原代码的循环拼接,更简洁高效
此方案效率足够,因为1-9中选4个无重复数字的组合里,不符合连续条件的占比极低,循环次数不会过多。
内容的提问来源于stack exchange,提问作者Rahumathulla
相关产品推荐
相关产品推荐

