首页 > 代码库 > 用权值实现数据被抽取的概率
用权值实现数据被抽取的概率
下列代码中人为的规定了是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; } }
用权值实现数据被抽取的概率
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。