You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算观测值平均值?观察者模式下随机数平均值传递问题

问题解答

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:36:28