当前位置: 首页 > article >正文

带权重的随机算法

假设有10名学生,其中5个男生,5个女生。

要求点到男生的概率为70%,女生的概率为30%。

给男生和女生设置权重,其中男生权重为7,女生权重为3。

public class Test02_case2 {
    public static void main(String[] args) throws IOException {
        //把文件中的学生全部读取出来放到集合中
        ArrayList<String> infoList = new ArrayList<>();
        //使用缓冲流读,因为可以一次读取一行
        BufferedReader br = new BufferedReader(new FileReader("name_10.txt"));
        String info;
        while ((info = br.readLine()) != null) {
            infoList.add(info);
        }
        ArrayList<Student> studentList = new ArrayList<>();
        for (String s : infoList) {
            String[] ss = s.split("-");
            Student student = new Student(ss[0], ss[1], Integer.parseInt(ss[2]),Double.parseDouble(ss[3]));
            studentList.add(student);
        }
        double sum = 0;
        for (Student student : studentList) {
            sum += student.getWeight();
        }
        double p1 = 5 * 7 / sum;
        double p2 = 5 * 3 / sum;
        double r = Math.random();
        int boyCount = 0;
        int girlCount = 0;
        for (int i = 0; i < 1000000; i++) {
            if (r <= 0.3) {
                girlCount++;
            } else {
                boyCount++;
            }
        }
        //统计概率
        double p3 = (double) boyCount / 1000000;
        double p4 = (double) girlCount / 1000000;
        System.out.println(p1);
        System.out.println(p2);

    }
}

 

public class Test05 {
    public static void main(String[] args) throws IOException {
        //把文件中的学生全部读取出来放到集合中
        ArrayList<String> infoList = new ArrayList<>();
        //使用缓冲流读,因为可以一次读取一行
        BufferedReader br = new BufferedReader(new FileReader("name_10_5.txt"));
        String info;
        while ((info = br.readLine()) != null) {
            infoList.add(info);
        }
        //把属性封装到对象中,并把所有对象放到集合中去
        ArrayList<Student> studentList = new ArrayList<>();
        for (String s : infoList) {
            String[] ss = s.split("-");
            Student student = new Student(ss[0], ss[1], Integer.parseInt(ss[2]), Double.parseDouble(ss[3]));
            studentList.add(student);
        }
        //计算权重总和
        double sum = 0;
        for (Student student : studentList) {
            sum += student.getWeight();
        }
        //概率
        double[] ww = new double[infoList.size()];
        for (int i = 0; i < ww.length; i++) {
            ww[i] = studentList.get(i).getWeight() / sum;
        }
        double[] proRange = new double[ww.length];
        for (int i = 0; i < proRange.length; i++) {
            if (i == 0) {
                proRange[i] = ww[i];
            } else {
                proRange[i] = proRange[i - 1] + ww[i];
            }
        }
        //随机点名
        double r = Math.random();
        System.out.println(r);
        int i = Arrays.binarySearch(proRange, r);
        int index = -(i + 1);
        Student student = studentList.get(index);
        System.out.println(student);

        //将点到的学生权重/2
        student.setWeight(student.getWeight() / 2);
        //
        System.out.println(student);
        //将减半后的权重重新写回
        BufferedWriter bw = new BufferedWriter(new FileWriter("name_10_5.txt"));
        for (Student student1 : studentList) {
            bw.write(student1.getName() + "-" + student1.getGender() + "-" + student1.getAge() + "-" + student1.getWeight());
            bw.newLine();
        }
        bw.close();

    }
}


http://www.kler.cn/a/285087.html

相关文章:

  • 卸载一直显示在运行的应用
  • Golang常见编码
  • 考研季来啦!考研过程中有哪些事情需要避坑?
  • 图像处理椒盐噪声
  • 微服务架构面试内容整理-消息驱动-RocketMQ
  • LeetCode:703. 数据流中的第 K 大元素
  • 机械学习—零基础学习日志(概率论总笔记1)
  • DRF——serializer中获取嵌套评论
  • 鸿蒙HarmonyOS之使用preferences首选项保存获取数据
  • 1、Java简介+DOS命令+java的编译运行(字节码/机器码、JRE/JVM/JDK的区别)+一个简单的Java程序
  • Linux 数据结构 树知识
  • shell小白学习记录
  • 如何将线程绑定到特定的CPU核
  • HarmonyOS开发实战( Beta5版)减小应用包大小
  • 【2024】Datawhale X 李宏毅苹果书 AI夏令营 Task2
  • Linux(CentOS 7)
  • element的el-date-picker组件实现只显示年月日时分,不显示秒
  • 2024最新VMware17安装Windows10详细记录
  • SQL进阶技巧:如何查询最近一笔有效订单? | 近距离有效匹配问题
  • 微信小程序 === 组件样式
  • WHAT - 一个 IP 地址与地理信息的关联
  • JAVA中如何自定义注解
  • Docker compose 安装 ELK
  • 【电力电子】单相并网逆变器
  • 在Vue2中使用WebSocket
  • C语言基础(二十一)