随机点名器

练习1 

package lx;

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

/*需求:
           需求:
               有一个文件里面存储了班级同学的信息,每一个信息占一行。
               格式为:张三-男-23
               要求通过程序实现随机点名器。

           运行效果:
               第一次运行程序:随机同学姓名1(只显示名字)
               第二次运行程序:随机同学姓名2(只显示名字)
               第三次运行程序:随机同学姓名3(只显示名字)
               …
        */
public class demo3 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("names.txt"));
        //创建集合存储读取的数据
        ArrayList<String> list = new ArrayList<>();
        String line;
        while ((line = br.readLine()) != null) {
            list.add(line);
        }
        br.close();

        //2.随机抽取(解法二)
        Collections.shuffle(list);
        String randomName2 = list.get(0);
        String[] arr2 = randomName2.split("-");
        System.out.println(arr2[0]);



    }
}

练习2

package lx;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

public class demo4 {
    /*需求:
          一个文件里面存储了班级同学的信息,格式为:张三-男-23
          每一个学生信息占一行。
          要求通过程序实现随机点名器。
          70%的概率随机到男生
          30%的概率随机到女生
          随机100万次,统计结果。看生成男生和女生的比例是不是接近于7:3
      */
    public static void main(String[] args) throws IOException {
        //1.读取数据,并把男生和女生的信息添加到不同的集合当中
        ArrayList<String> boyNameList = new ArrayList<>();
        ArrayList<String> girlNameList = new ArrayList<>();
        BufferedReader br = new BufferedReader(new FileReader("names.txt"));
        String line;
        while ((line = br.readLine()) != null) {
            String[] arr = line.split("-");
            if (arr[1].equals("男")) {
                boyNameList.add(line);
            } else {
                girlNameList.add(line);
            }
        }
        br.close();

        //2.定义权重集合,男女比例:7:3
        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list,1,1,1,1,1,1,1,0,0,0);
        //打乱集合顺序
        Collections.shuffle(list);
        //3.定义变量,统计被点到的次数
        int boyCount = 0;
        int girlCount = 0;
        //随机在集合里抽取一个数,通过这个数是0还是1判断男女
        Random r = new Random();
        for (int i = 0; i < 1000000; i++) {
            int index = r.nextInt(list.size());
            int  number = list.get(index);
            //判断number是1还是0
            if( number == 1){
                //是男生
                //随机一下男生集合的元素
                int boy = r.nextInt(boyNameList.size());
                System.out.println(boyNameList.get(boy));
                boyCount++;
            }else{
                //0就随机女生

                int girl = r.nextInt(girlNameList.size());

                System.out.println(girlNameList.get(girl));
                girlCount++;
            }
        }
        System.out.println("随机抽取100万次,其中男生被抽到了" + boyCount);
        System.out.println("随机抽取100万次,其中女生被抽到了" + girlCount);



    }
}

练习3

package lx;

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

/*需求:
           一个文件里面存储了班级同学的姓名,每一个姓名占一行。
           要求通过程序实现随机点名器。
           第三次必定是张三同学

         运行效果:
           第一次运行程序:随机同学姓名1
           第二次运行程序:随机同学姓名2
           第三次运行程序:张三
           …
       */
public class demo6 {
    public static void main(String[] args) throws IOException {
        BufferedReader br1 = new BufferedReader(new FileReader("names.txt"));
        String line;
        //创建集合存储读取的数据
        ArrayList<String> list = new ArrayList<>();
        while ((line = br1.readLine()) != null) {
            list.add(line);
        }
        br1.close();
        //2.读取当前程序已经运行的次数
        BufferedReader br2 = new BufferedReader(new FileReader("count.txt"));
        String str = br2.readLine();
        int count = Integer.parseInt(str);
        //软件再运行一次count++
        count++;
     /*   if (count <= 2) {
            System.out.println(list.get(count));
        }*/
        //现在list集合里面存的是比如张三-男-18这样的格式
        //我们要以-为分割获取0索引的姓名

        if (count == 3) {
            System.out.println("张三");

        } else {
            //随机抽取
            //打乱集合的数据
            Collections.shuffle(list);
            String randomName2 = list.get(0);
            String[] arr2 = randomName2.split("-");
            System.out.println(arr2[0]);
        }

        //把自增的count写到本地文件当中 ,方便下次br2读取数据的时候,count的值有变化

        BufferedWriter bw = new BufferedWriter(new FileWriter("count.txt"));

        bw.write(count + "");

        bw.close();


    }
}

 

练习4

package lx;

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

/*需求:
         一个文件里面存储了班级同学的姓名,每一个姓名占一行。
         要求通过程序实现随机点名器。
       运行结果要求:
         被点到的学生不会再被点到。
         但是如果班级中所有的学生都点完了, 需要重新开启第二轮点名。
       核心思想:
            点一个删一个,把删除的备份,全部点完时还原数据。

     */
public class demo8 {
    public static void main(String[] args) throws IOException {
        //1.定义变量,表示初始文件路径,文件中存储所有的学生信息
            String src = "allnames.txt";
            //2.定义变量,表示备份文件,一开始文件为空
        String copy = "copy.txt";
        //3.读取初始文件中的数据,并把学生信息添加到集合当中
        ArrayList<String> list = readFile(src);
        //4.判断集合中是否有数据
        if (list.size() == 0) {
            //5.如果没有数据了,表示所有的学生点完了,从copy.txt中把数据给allnames.txt即可
            //传给allnames.txt如下
            //5.1 读取copy.txt中的所有数据
            list = readFile(copy);
            //5.2 把读出来的数据写入allnames.txt(初始化文本当中)
            writeFile(list, src, false);
            //5.3 清空 copy文件中的数据
            FileWriter fw = new FileWriter(copy);
            fw.write(" ");
            fw.close();


        }
        //5.集合中有数据,表示还没有点完,随机一个删一个,把删除的备份到copy.txt当中
        //打乱集合
        Collections.shuffle(list);
        //获取0索引的学生信息并删除
        String stuInfo = list.remove(0);
        //打印随机到的学生信息
        System.out.println("当前被点到的学生为:" + stuInfo);
        //把随机出来的学生信息(除了被删除的,把list集合中的数据全部)写入allnames.txt当中

        //此时的list集合的数据随一个少一个
        System.out.println("还剩下" + list.size() + "个学生");

        //刷新allnames.txt中的学生信息
        writeFile(list, src, false);
        //把删除的学生写到copy.txt文件当中,追加写入,随一个写一个
        writeFile(stuInfo, copy, true);
    }

    private static void writeFile(String stuInfo, String copy, boolean b) throws IOException {
        BufferedWriter bw = new BufferedWriter(new FileWriter(copy, b));
        bw.write(stuInfo);
        bw.newLine();
        bw.close();
    }

    //定义方法,把所有学生信息写入到文初始化文件(allnames.txt)中
    private static void writeFile(ArrayList<String> list, String src, boolean b) throws IOException {
        BufferedWriter bw = new BufferedWriter(new FileWriter(src, b));
        //list这个集合存储了copy.txt的数据,也就是所有学生信息
        for (String s : list) {
            bw.write(s);
            bw.newLine();
        }
        bw.close();
    }

    //定义方法,把读取出来的学生信息添加到集合当中
    private static ArrayList<String> readFile(String src) throws IOException {
        //创建一个字符流
        BufferedReader br = new BufferedReader(new FileReader(src));
        //创建一个集合存储读到数据
        ArrayList<String> list = new ArrayList<>();
        String line;
        while ((line = br.readLine()) != null) {
            list.add(line);

        }
        return list;

    }
}

练习5

首先初始化文本信息

package lx;

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

public class demo10 {
    public static void main(String[] args) throws IOException {
        //1.读取文件中的数据,添加到集合当中
        ArrayList<Student> list = new ArrayList<>();
        BufferedReader br = new BufferedReader(new FileReader("..\\day51\\src\\lx\\names.txt"));
        String line;
        while ((line = br.readLine()) != null) {
            //现在我们把钦逸抒-女-21-1.0文件中的学生信息 以-分割
            //其实0索引是姓氏,1索引是性别,2索引是年龄,3索引是权重
            String[] arr = line.split("-");
            //把这些索引对应的信息赋给学生的属性
            Student stu = new Student(arr[0], arr[1], Integer.parseInt(arr[2]), Double.parseDouble(arr[3]));
            list.add(stu);
        }
        br.close();
        //2.计算出所有学生总权重
        double sum=0;
        for (Student student : list) {
            sum+=student.getWeight();
        }
        System.out.println("总权重为"+sum);
        //3.计算每一个学生的实际占比
        double[]arr=new double[list.size()];
        for (int i = 0; i < list.size(); i++) {
            arr[i]=list.get(i).getWeight()/sum;
        }
       // System.out.println(Arrays.toString(arr));//[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]

        //4.计算每一个学生的权重占比范围
        //每一个学生的权重占比范围是0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0之间
        //每一个学生的实际占比是    0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
        //怎么得到权重占比范围呢?
        //从第一位索引开始 本索引的权重占比是上一个索引的权重占比+当前索引的权重占比
        for (int i = 1; i < arr.length; i++) {
            arr[i]=arr[i]+arr[i-1];
        }

        System.out.println(Arrays.toString(arr));

        //5.随机生成一个0-1之间的数,判断这个数在哪个区间,就返回对应的索引

        double number = Math.random();
        //采用二分查找方法
        //该方法返回 -插入点-1
        //插入点=-结果-1
        int result = -Arrays.binarySearch(arr, number)-1;
        System.out.println("随机数:"+number);
        System.out.println("插入索引"+result);

        //6.返回对应的索引对应的学生信息
        Student stu = list.get(result);
        System.out.println("学生信息:"+stu);

        //7.修改当前学生的权重
        double w=stu.getWeight()/2;
        stu.setWeight(w);

        System.out.println("修改后的学生信息:"+stu);
        //8.写到本地文件当中
        BufferedWriter bw=new BufferedWriter( new FileWriter("..\\day51\\src\\lx\\names.txt"));
        for (Student s : list) {
            //s代表集合里的每一位学生对象
            //把学生信息写到本地文件当中
            bw.write(s.toString());
            bw.newLine();
        }

        bw.close();


    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值