练习:随机点名器5

题目:

TxT文件中事先准备好一些学生信息,每个学生的信息独占一行。,要求1:每次被点到的学生,再次被点到的概率在原先的基础上降低一半。

举例:80个学生,点名5次,每次都点到小A,概率变化情况如下:,第一次每人概率:1.25%。,第二次小A概率:0.625%。,其他学生概率:1.2579%,第三次小A概率:0.3125%。,其他学生概率:1.261867%,第四次小A概率:0.15625%。,其他学生概率:1.2638449%,第五次小A概率:0.078125%。,其他学生概率:1.26483386%,

提示:本题的核心就是带权重的随机

代码:

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;

public class Demo07 {
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new FileReader("D:\\javaSE\\java\\src\\IO\\Text\\b.txt"));
        String len;
        ArrayList<Students> list = new ArrayList<>();
        while ((len=bufferedReader.readLine())!=null) {
            String[] split = len.split("-");
            Students students = new Students(split[0],split[1],Integer.parseInt(split[2]),Double.parseDouble(split[3]));
            list.add(students);
        }
        bufferedReader.close();
        //计算权重的总和
        double weight=0;
        for (Students students : list) {
            weight=weight+students.getNumber();
        }
        System.out.println(weight);
        //计算出每个人的权重
        double[] doubles = new double[list.size()];
        for (Students students : list) {
            for (int i1 = 0; i1 < doubles.length; i1++) {
                doubles[i1]=students.getNumber()/weight;
            }
        }
        //计算每一人的权重占比
        for (int i1 = 1; i1 < doubles.length; i1++) {
            doubles[i1]=doubles[i1]+doubles[i1-1];
        }
        double random = Math.random();
        int i1 = -Arrays.binarySearch(doubles, random)-1;
        Students students = list.get(i1);//随机到的数
        //减少概率
        double v = students.getNumber() / 2;
        students.setNumber(v);
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("D:\\javaSE\\java\\src\\IO\\Text\\b.txt"));
        for (Students students1 : list) {
            bufferedWriter.write(students1.toString());
            bufferedWriter.newLine();
        }
        bufferedWriter.close();
    }
}

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值