Java练习:自动点名器

1.班级有n个学生,实现随机点名器

package a03Test;

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

public class Test1 {
    public static void main(String[] args) {
        //1.定义集合
        ArrayList<String> list=new ArrayList<>();
        //2.添加数据
        Collections.addAll(list,"蒋丞","顾飞","盛望","江添","谢俞","贺朝","喻繁","陈景深","简松意","柏淮");
        //3.随机点名
        //方法1:
        /*Random r=new Random();
        int index = r.nextInt(list.size());
        String name = list.get(index);
        System.out.println(name);
        */
        //方法2:
        Collections.shuffle(list);//打乱了所以获取0索引的数据就是随机的
        String name = list.get(0);
        System.out.println(name);

    }
}

运行结果:

2.要求:70%的概率随机到男生,30%的概率随机到女生

package a03Test;

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

public class Test2 {
    public static void main(String[] args) {
        //1.创建集合
        ArrayList<Integer> list=new ArrayList<>();
        //2.添加数据
        Collections.addAll(list,1,1,1,1,1,1,1);
        Collections.addAll(list,0,0,0);
        //3.打乱集合中的数据
        Collections.shuffle(list);
        //4.从list集合中随机抽取0或1
        Random r=new Random();
        int index = r.nextInt(list.size());
        int number = list.get(index);
        System.out.println(number);
        //5.创建两个集合存储男生和女生的名字
        ArrayList<String> boyList=new ArrayList<>();
        ArrayList<String> girlList=new ArrayList<>();
        Collections.addAll(boyList,"男一","男二","男三","男四","男五","男六","男七","男八","男九","男十");
        Collections.addAll(girlList,"女一","女二","女三","女四","女五");
        //6.此时从boyList里面取还是从girlList里面取
        if(number==1){
            int boyIndex = r.nextInt(boyList.size());
            String boyname = boyList.get(boyIndex);
            System.out.println(boyname);
        }else {
            int girlIndex = r.nextInt(girlList.size());
            String girlname = girlList.get(girlIndex);
            System.out.println(girlname);
        }
    }
}

运行结果:

3.被点到的学生不会再次被点到,但是如果班级里所有的学生都点完了,需要重新开启第二轮点名

package a03Test;

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

public class Test3 {
    public static void main(String[] args) {
        //1.定义集合
        ArrayList<String> list1=new ArrayList<>();
        //2.添加数据
        Collections.addAll(list1,"蒋丞","顾飞","盛望","江添","谢俞","贺朝","喻繁","陈景深","简松意","柏淮");
        //创建一个临时的集合用来存储已经点到学生的名字
        ArrayList<String> list2=new ArrayList<>();

        //外循环表示轮数
        for (int i = 1; i <= 10; i++) {
            System.out.println("==============第"+i+"轮点名开始了=============");
            //获取集合的长度
            int count=list1.size();

            //3.随机点名
            Random r=new Random();
            //内循环表示随机循环抽取的过程
            for (int j = 0; j < count; j++) {
                int index = r.nextInt(list1.size());
                String name = list1.remove(index);
                list2.add(name);
                System.out.println(name);
            }
            //此时表示一轮点名结束
            //list1空了,List2存了10个学生的名字
            list1.addAll(list2);
            list2.clear();
        }
    }
}

运行结果:

4.要求1:每次被点到的学生,再次被点到的概率在原先的基础上降低一半

Student类:

package a07commonsio;

public class Student {
    private String name;
    private String gender;
    private int age;
    private double weight;

    public Student() {
    }

    public Student(String name, String gender, int age, double weight) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.weight = weight;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public String toString() {
        return name + "-" + gender + "-" + age + "-" + weight;
    }
}

测试类:

package a07commonsio;

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

public class Test2 {
    public static void main(String[] args) throws IOException {
        //1.把文件中所有的学社信息读取到内存中
        ArrayList<Student> list = new ArrayList<>();
        BufferedReader br = new BufferedReader(new FileReader("Test\\names.txt"));
        String line;
        while ((line = br.readLine()) != null) {
            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 weight = 0;
        for (Student stu : list) {
            weight = weight + stu.getWeight();
        }
        //3.计算每一个人的实际占比
        double[] arr = new double[list.size()];
        int index = 0;
        for (Student stu : list) {
            arr[index] = stu.getWeight() / weight;
            index++;
        }
        //4.计算每一个人的权重占比范围
        for (int i = 1; i < arr.length; i++) {
            arr[i]=arr[i]+arr[i-1];
        }
        //5.随机抽取
        //获取一个0.0到1.0之间的随机数
        double number = Math.random();
        //判断number在arr中的位置
        //二分查找
        //方法返回-插入点-1
        //获取number这个数据在数组中的插入点位置
        //插入点=-结果-1
        int result= -Arrays.binarySearch(arr, number)-1;
        Student stu = list.get(result);
        System.out.println(stu);
        //6.修改当前学生的权重
        double w = stu.getWeight() / 2;
        stu.setWeight(w);
        //7.把集合中的数据再次写到文件中
        BufferedWriter bw=new BufferedWriter(new FileWriter("Test\\names.txt"));
        for (Student s : list) {
            bw.write(s.toString());
            bw.newLine();
        }
        bw.close();



    }
}

运行结果:(运行了两次)

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值