编写数据包比特校验程序遇逻辑错误,求代码问题解析
代码逻辑误区解析与修正
你的代码存在两个关键问题,导致无法正确检查数据包比特是否损坏:
1. 核心逻辑完全颠倒
packetOK方法的目标是当所有比特都正常时返回true,只要有一个比特损坏就返回false,但当前逻辑完全搞反了:
- 现在的代码会在遍历到第一个正常的比特时就直接返回true,完全忽略后续比特的状态。哪怕后面所有比特都损坏,方法也会错误地返回true。
- 正确逻辑应该是:遍历过程中只要发现一个比特损坏(
bitOK(p)返回false),就立即返回false;只有当所有比特都检查通过,才返回true。
2. Random实例重复初始化导致随机数异常
每次调用bitOK都新建Random实例会导致随机数生成不稳定:
Random默认用当前系统时间作为种子,如果短时间内多次调用bitOK,种子可能重复,生成的随机数会高度一致,导致比特出错的概率不符合设定的p值。- 正确做法是复用同一个
Random实例,将其声明为类的静态成员。
修正后的代码
import java.util.Random; public class PacketChecker { // 复用同一个Random实例,保证随机数生成的稳定性 private static final Random rnd = new Random(); // 比特正常返回true,出错概率为p时返回false public static boolean bitOK(double p) { // 简化逻辑,直接返回判断结果 return rnd.nextDouble() >= p; } // 检查数据包:所有比特正常返回true,否则返回false public static boolean packetOK(int size, double p){ for(int i = 0; i < size; i++) { // 发现损坏比特直接返回false if (!bitOK(p)) { return false; } } // 所有比特都正常 return true; } }
内容的提问来源于stack exchange,提问作者brah79
相关产品推荐
相关产品推荐

