首页 > 解决方案 > 描述这种随机但公平地调用学生的程序/算法的正确术语是什么?

问题描述

作为一名教师,我想设计一个程序来帮助我随机召唤学生。随机数生成器不够好,因为很少有学生可能很少被这种方式调用。我也不想要一个随机队列生成器,因为我刚刚拜访过的学生可以自信地停止关注,直到我拜访她的其他同学。

理想情况下,我可以使用某种程序在随机队列上调用学生 1-10,但偶尔会偏离该队列来调用以前调用的学生。这将确保所有学生都被合理地频繁地召集,而且最近被召集的学生不会因为我暂时不会再召集他而沾沾自喜。例如,我需要这样的随机输出:5、7、2、1、1、9、10、5、3、6、8、9、4...

描述这种程序的正确术语是什么?我不一定要寻找有关如何编写此类代码的答案,尽管那也很好。

标签: javac#algorithmrandomdata-structures

解决方案


您可以使用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);
        }
    }
}

推荐阅读