计数器随机增减后需回归初始值的PHP代码实现困惑
解决方案:让随机增减后计数器回到初始值
首先得戳破核心问题:要让计数器最终和初始值一致,必须保证增加的次数和减少的次数完全相等——毕竟每次+1和-1会相互抵消,所以总次数$times必须是偶数(不然增减次数根本没法对等),这是实现目标的前提条件。你的原代码是完全随机生成0/1,大概率凑不出刚好相等的增减次数,所以很难达成需求。
下面给两种可行的解决方案:
方案1:强制保证增减次数相等(推荐)
直接生成刚好一半1(加操作)、一半0(减操作)的序列,再打乱顺序执行。这样不管顺序怎么随机,最终计数器一定会回到初始值:
$counter = 10; $times = 20; // 先判断次数是否为偶数,奇数的话永远不可能回到初始值 if ($times % 2 !== 0) { echo "错误:次数必须是偶数才能让计数器回到初始值"; exit; } // 生成包含 $times/2 个1和 $times/2 个0的数组 $operations = array_merge( array_fill(0, $times / 2, 1), array_fill(0, $times / 2, 0) ); // 打乱数组,让操作顺序随机 shuffle($operations); // 执行所有操作 foreach ($operations as $number) { $counter += $number === 1 ? 1 : -1; } echo $counter; // 必然输出初始值10
方案2:循环重试直到满足条件(不推荐,仅作参考)
如果一定要保留“完全随机生成每次操作”的逻辑,可以把整个过程放在循环里,直到最终结果符合要求。但要注意:如果$times是奇数,这个循环会无限执行,所以必须先做奇偶判断:
$initial_counter = 10; $times = 20; // 奇数次数直接终止,不可能实现目标 if ($times % 2 !== 0) { echo "错误:次数为奇数时,计数器无法回到初始值"; exit; } // 循环重试直到结果符合要求 do { $counter = $initial_counter; $remaining_times = $times; while ($remaining_times > 0) { $number = rand(0, 1); $counter += $number === 1 ? 1 : -1; $remaining_times--; } } while ($counter !== $initial_counter); echo $counter; // 最终会输出初始值10
补充说明
- 原代码的问题:每次生成0/1是独立随机事件,
$times=20时,刚好生成10个1和10个0的概率只有约17.6%,所以大部分时候没法回到初始值。 - 必须优先判断
$times的奇偶性:奇数次操作后,计数器的奇偶性会和初始值相反(比如初始是偶数,奇数次±1后会变成奇数),永远不可能相等。
内容的提问来源于stack exchange,提问作者B. Dionys
相关产品推荐
相关产品推荐

