java - 描述这种随机但公平地调用学生的程序/算法的正确术语是什么?
问题描述
作为一名教师,我想设计一个程序来帮助我随机召唤学生。随机数生成器不够好,因为很少有学生可能很少被这种方式调用。我也不想要一个随机队列生成器,因为我刚刚拜访过的学生可以自信地停止关注,直到我拜访她的其他同学。
理想情况下,我可以使用某种程序在随机队列上调用学生 1-10,但偶尔会偏离该队列来调用以前调用的学生。这将确保所有学生都被合理地频繁地召集,而且最近被召集的学生不会因为我暂时不会再召集他而沾沾自喜。例如,我需要这样的随机输出:5、7、2、1、1、9、10、5、3、6、8、9、4...
描述这种程序的正确术语是什么?我不一定要寻找有关如何编写此类代码的答案,尽管那也很好。
解决方案
您可以使用Fisher-Yates 洗牌 示例:
public class Program {
static void shuffle(int[] array) {
int n = array.length;
Random random = new Random();
for (int i = 0; i < array.length; i++) {
int randomValue = i + random.nextInt(n - i);
int randomElement = array[randomValue];
array[randomValue] = array[i];
array[i] = randomElement;
}
}
public static void main(String[] args) {
int[] values = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
shuffle(values);
// Display elements in array.
for (int value : values) {
System.out.println(value);
}
}
}
推荐阅读
- python - 'if a == b[0]' 在使用 readlines() 时不起作用已解决
- sql - 如何在 SELECT 中声明变量?
- ios - 如何在 swift 5 (iOS) 中读取由模拟器在 Library/Developer/CoreSimulator/Devices/ 保存的 JSON 文件
- excel - 格式 (36.4K) 为 -36400,1.0k 为 1000
- python - 我正在尝试对列表进行分段,然后根据给定的输入值删除重复项?但是我错过了一些东西
- c++ - 窗口透明覆盖在几秒钟后停止工作
- raspberry-pi - 使用 Raspberry Pi 系统制作合适的游戏机需要什么?
- sql - 在雪花中展平两个不同的 JSON 数组
- tree - 具有 cplex-opl 的最小生成树
- sql - 如何最好地拆分数据库表?