在table/java上不重复地绘制六个随机数

在table/java上不重复地绘制六个随机数,java,Java,您好,我有重复的随机绘图。我试着在表上这样做,但每次我都无法将生成的随机数与表中的数字进行比较。请小心,因为这段代码现在是无止境的循环,它将ArrayIndexOutOfBoundsException抛出。你有什么想法吗?向你们展示我想要的类似于波兰电视节目Lotto,他们在球上画6个随机数字,不重复。 我看过这个主题,在列表中做了什么,但在这样的表格上是可能的 public static void main(String[] args) { Lotto lot = new Lotto

您好,我有重复的随机绘图。我试着在表上这样做,但每次我都无法将生成的随机数与表中的数字进行比较。请小心,因为这段代码现在是无止境的循环,它将ArrayIndexOutOfBoundsException抛出。你有什么想法吗?向你们展示我想要的类似于波兰电视节目Lotto,他们在球上画6个随机数字,不重复。 我看过这个主题,在列表中做了什么,但在这样的表格上是可能的

public static void main(String[] args) {

    Lotto lot = new Lotto();

    int[] table = new int[6];

    Random random = new Random();

    for(int i = 0; i < 6; i++) {
        int numbers = random.nextInt(48) + 1;
        for(int k = 0; k < 6; k++) {
            if (table[k] != numbers) {
                try {
                    table[i] = numbers;
                } catch (ArrayIndexOutOfBoundsException e){
                    System.out.println(e); 
                } 
            } else {
                i--;
            }
        }
    }

    Arrays.sort(table);

    for (int m = 0; m < 6; m++) {
        System.out.println(table[m]);
    }

}
publicstaticvoidmain(字符串[]args){
乐透抽签=新乐透();
int[]表=新int[6];
随机=新随机();
对于(int i=0;i<6;i++){
整数=random.nextInt(48)+1;
对于(int k=0;k<6;k++){
if(表[k]!=数字){
试一试{
表[i]=数字;
}捕获(阵列索引边界外异常e){
系统输出打印ln(e);
} 
}否则{
我--;
}
}
}
数组。排序(表);
对于(int m=0;m<6;m++){
系统输出打印LN(表[m]);
}
}

我建议采用以下方法:

    // Get list of all number
    List<Integer> all = new ArrayList<>();
    for (int i = 1; i <= 48; i++) {
        all.add(i);
    }

    //Shuffle it
    Collections.shuffle(all);

    //Take first 6
    List<Integer> result = all.subList(0, 6);
//获取所有编号的列表
List all=new ArrayList();

对于(int i=1;i我建议以下方法:

    // Get list of all number
    List<Integer> all = new ArrayList<>();
    for (int i = 1; i <= 48; i++) {
        all.add(i);
    }

    //Shuffle it
    Collections.shuffle(all);

    //Take first 6
    List<Integer> result = all.subList(0, 6);
//获取所有编号的列表
List all=new ArrayList();

对于(int i=1;i有两种流行的技术,只选择可用的项目或选择任何可能的项目并检查是否已选择。此答案从可能的数字中选择,检查是否已选择该数字。如果尚未选择,则将其添加到数组中。如果已选择,则重复此过程

for(int i = 0; i < 6; i++) {
    boolean selected = false;
    while(!selected){
        selected = true;
        int numbers = random.nextInt(48) + 1;
        for(int k = 0; k <= i; k++) {
            if (table[k] == numbers) {
                selected = false;
                break; 
            } 
        }
        if(selected){
           table[i] = numbers;
        } 
    }
}
for(int i=0;i<6;i++){
所选布尔值=false;
而(!已选定){
所选=真;
整数=random.nextInt(48)+1;

对于(int k=0;k有两种流行的技术,只选择可用的项目或选择任何可能的项目并检查是否已选择。此答案从可能的数字中选择,检查是否已选择该数字。如果尚未选择,则将其添加到数组中。如果已选择,则重复此过程

for(int i = 0; i < 6; i++) {
    boolean selected = false;
    while(!selected){
        selected = true;
        int numbers = random.nextInt(48) + 1;
        for(int k = 0; k <= i; k++) {
            if (table[k] == numbers) {
                selected = false;
                break; 
            } 
        }
        if(selected){
           table[i] = numbers;
        } 
    }
}
for(int i=0;i<6;i++){
所选布尔值=false;
而(!已选定){
所选=真;
整数=random.nextInt(48)+1;

对于(int k=0;k尝试对现实世界建模,并让应用程序执行现实生活中发生的操作。您有48个球,编号为1到48。让我们收集它们:

List<Integer> ballsInTheMachine = new ArrayList<>(48);
for (int i = 1; i <= 48; i++)
    ballsInTheMachine.add(i);
List ballsInTheMachine=new ArrayList(48);

对于(int i=1;i尝试对现实世界建模,让应用程序执行现实生活中发生的操作。您有48个球,编号为1到48。让我们收集它们:

List<Integer> ballsInTheMachine = new ArrayList<>(48);
for (int i = 1; i <= 48; i++)
    ballsInTheMachine.add(i);
List ballsInTheMachine=new ArrayList(48);

对于(int i=1;i我会这样做:

TreeSet<Integer> t = new TreeSet<>();
while (t.size()<6) {
    t.add((int)(Math.random()*48+1));
}
TreeSet=newtreeset();

而(t.size()我会这样做:

TreeSet<Integer> t = new TreeSet<>();
while (t.size()<6) {
    t.add((int)(Math.random()*48+1));
}
TreeSet=newtreeset();

而(t.size()你是说你想不重复地画六个不同的球吗?例如:我先画1,现在下一次我画可能性现在是2,3,4,5,6?问题是你在内环中把I减少了6倍!你是说你想不重复地画六个不同的球吗?例如:我先画1,现在下一次我画现在的可能性是2,3,4,5,6?问题是你在内部循环中将i减少了6倍!你对两种技术的分析——洗牌和反复挑选一个随机数,直到它不是重复的——以及它们的优缺点,以及何时选择每一种都是有用的。但是,你错过了第三种技术(见我的答案)这就避免了另外两个错误:从48个随机抽取6个而不洗掉所有48个。“dodGyCo例外”是的,我会考虑洗掉你所显示的技术的一个变种。我做了一个测试,我发现混洗比在某个时候去除要好。我创建了一个测试,但是我认为实现细节可以是一个测试。影响结果。你说得有道理。从ArrayList中删除包含移动所有剩余元素,这是一个O(N)操作。随机移动的作用是随机交换元素。因此,为了避免删除,我可以执行与随机移动相同的操作,但在达到6时停止。(顺便说一下,在测试代码中,你应该真正使用System.nanoTime()与System.currentTimeMillis()不同,或者更好的做法是使用JMH。)您对两种技术的分析——随机洗牌和反复挑选一个随机项直到它不是重复项——以及它们的优缺点,以及何时选择每种技术都是有用的。但是,您遗漏了第三种技术(请参阅我的答案)这就避免了另外两个错误:从48个随机抽取6个而不洗掉所有48个。“dodGyCo例外”是的,我会考虑洗掉你所显示的技术的一个变种。我做了一个测试,我发现混洗比在某个时候去除要好。我创建了一个测试,但是我认为实现细节可以是一个测试。影响结果。你说得有道理。从ArrayList中删除包含移动所有剩余元素,这是一个O(N)操作。随机移动的作用是随机交换元素。因此,为了避免删除,我可以执行与随机移动相同的操作,但在达到6时停止。(顺便说一下,在测试代码中,你应该真正使用System.nanoTime()而不是System.currentTimeMillis(),或者更好的方法是仍然使用JMH。)