如何计算观测值平均值?观察者模式下随机数平均值传递问题
问题解答
1. 观测值平均值的计算方法
咱们先来说说怎么算观测值的平均值,其实逻辑很简单,核心就是总和除以有效观测值的数量,具体可以按这几步来:
- 第一步:先把所有有效的观测值收集起来,如果有无效数据(比如null、非数值类型),记得先过滤掉,避免影响结果
- 第二步:把所有有效观测值相加,得到总和
- 第三步:用总和除以有效观测值的个数,就能得到平均值
- 小提醒:如果没有有效观测值,一定要做个判断,别直接除以0,可以返回0或者抛出提示信息,避免程序报错
2. 观察者模式下传递随机数平均值的实现方案
针对你遇到的Java观察者模式问题,我来帮你补全代码并解释清楚怎么实现:
首先,我们需要一个主题类(也就是生成随机数的源头),它要继承Java自带的Observable,负责生成随机数、计算平均值,然后把平均值传给观察者。然后补全你的观察者类A和B的代码:
完整代码示例
主题类(生成随机数+计算平均值)
import java.util.Observable; import java.util.Random; public class RandomNumberSubject extends Observable { private double total; // 存储随机数总和 private int count; // 记录生成的随机数数量 private final Random random = new Random(); // 生成随机数的方法 public void generateRandomNumber() { // 这里生成0-100的随机数,你可以根据需求调整范围 double randomNum = random.nextDouble() * 100; total += randomNum; count++; // 计算平均值,注意处理count为0的情况(避免除以0) double observationsAvg = count == 0 ? 0 : total / count; // 标记主题状态已改变,然后通知所有观察者,把平均值传过去 setChanged(); notifyObservers(observationsAvg); } }
抽象观察者类A与具体观察者类B
import java.util.Observable; import java.util.Observer; // 抽象观察者类A public abstract class A implements Observer { public abstract String disp(); @Override public abstract void update(Observable subject, Object o); } // 具体观察者类B public class B extends A { public double limit; public B(double limit) { this.limit = limit; } @Override public void update(Observable o, Object o1) { // 接收传递过来的平均值,先判断类型是否正确 if (o1 instanceof Double) { double observationsAvg = (Double) o1; // 这里可以根据你的需求做处理,比如和阈值limit对比 System.out.println("当前所有随机数的平均值:" + observationsAvg); if (observationsAvg > limit) { System.out.println("⚠️ 平均值超过设定阈值" + limit + "了!"); } } } @Override public String disp() { // 实现disp方法,比如返回观察者的基本信息 return "观察者B,阈值设置为:" + limit; } }
测试代码
public class ObserverTest { public static void main(String[] args) { // 创建主题实例 RandomNumberSubject numberSubject = new RandomNumberSubject(); // 创建观察者实例,设置阈值为50 B observerB = new B(50); // 将观察者注册到主题上 numberSubject.addObserver(observerB); // 生成5个随机数测试效果 for (int i = 0; i < 5; i++) { numberSubject.generateRandomNumber(); } } }
关键逻辑说明
- 主题类里用
total和count两个变量维护随机数的总和和生成数量,每次生成新随机数后更新这两个值,再计算平均值 - 调用
setChanged()是必须的,它用来标记主题的状态发生了变化,否则notifyObservers()不会触发通知 notifyObservers(observationsAvg)把计算好的平均值作为参数传递给所有注册的观察者- 在B类的
update方法中,我们把传递过来的Object转成Double类型,就拿到了平均值,之后就可以按照你的需求做后续处理啦
内容的提问来源于stack exchange,提问作者csse
相关产品推荐
相关产品推荐

