首页 > 代码库 > 用权值实现数据被抽取的概率

用权值实现数据被抽取的概率

下列代码中人为的规定了是20个人.

RandomTest.java

import java.util.Random;
import java.util.Scanner;

public class RandomTest {
    public static void main(String[] args) {

        /**
         * 定义一个工具类
         */
        Tool tool = new Tool();

        String[] names = new String[20]; // 定义一个长度为20的名字数组,并给名字赋值
        names = tool.addName(names);

        int[] marks = new int[20];        //定义一个长度为20的标记数组,初始化为0
        double[] scores = new double[20]; // 定义一个长度为20的总分数数组,初始化为0
        int[] times = new int[20];        // 定义一个长度为20的答题次数数组,初始化为0
        int[] weights = new int[20];      // 定义一个长度为20的权重,初始化为0
        int sumPeople = 19;               // 判断抽取人的次数,在没每个人都被提问一次时
        int sumTime = 0;                  // 记录在二次重复提取人时,提取人的次数,处理重复提取问题

        Random random = new Random();

        Scanner in = new Scanner(System.in);

        while (true) {

            /**
             * 首先保证所有的人都被提问到
             */
            while ( sumPeople >= 0) {

                int point =  random.nextInt(20);   // 随机抽取被提问人的序号

                if (marks[point] != 1) {           // 判断抽取到的人是否被提问过,如果提问过则重新随机抽取

                    System.out.println("当前为: " + names[point]);
                    marks[point] = 1;
                    times[point] += 1;     // 统计学生回答问题的次数
                    scores[point] = scores[point]  + in.nextDouble();  // 统计学生回答问题的总成绩
                    weights[point] = (int)( scores[point] / times[point] - 11 ) * (-1); // 根据总成绩和次数来求得权值
                    sumPeople -= 1;
                }

            }

            int weightSum = 0;     // 求权值的和
            for(int weight : weights) {
                weightSum += weight;
            }

            int point = random.nextInt(weightSum);  // 从权值和中随机取出数值,用来找对应的学生的位置
            int variable = 0;    // 记录人成绩的权值,用来判断随机数落在哪个范围内

            for (int i = 0; i < 20; i++ ) {

                variable += weights[i];

                if (variable >= point && marks[i] != 0) {   // marks[i] != 0用来保证同一个人不能被重复提问
                    System.out.println("二次当前为: " + names[i]);
                    times[i] += 1;
                    scores[i] = scores[i]  + in.nextDouble();
                    weights[i] = (int)( scores[i] / times[i] - 11 ) * (-1);
                    marks[i] = 0;
                    sumTime += 1;
                    break;
                }

            }

            if (sumTime % 20 == 0) {
                for (int i = 0; i < 20; i ++) {
                    marks[i] =  0;
                }
            }
        }

    }
}

Tool.java

public class Tool {

    /**
     * 给名字数组初始化
     * @param names
     * @return
     */
    public String[] addName(String[] names) {

        for (int i = 0; i < names.length;i++) {
            names[i] =  "100" +  i;
        }

        return names;
    }
}



用权值实现数据被抽取的概率