数组JAVA中的非重复随机数

laz*_*ANZ 2 java arrays random

我想在一个数组中生成6个数字,同时对它进行比较,因此它不会相同或没有重复数字.例如,我想以任何顺序生成1-2-3-4-5-6,最重要的是不重复.所以我想的是逐个比较生成的数组中的当前数组,如果数字重复,它将重新运行该方法并再次随机化一个数字,这样就可以避免重复数字.

这是我的代码:

import javax.swing.*;
public class NonRepeat
{
    public static void main(String args[])
    {
        int Array[] = new int [6];
        int login = Integer.parseInt(JOptionPane.showInputDialog("ASD"));
        while(login != 0)
        {
            String output="";

            for(int index = 0; index<6; index++)
            {
                Array[index] = numGen();

                for(int loop = 0; loop <6 ; loop++)
                {
                    if(Array[index] == Array[loop])
                    {
                        Array[index] = numGen();
                    }
                }


            }

            for(int index = 0; index<6; index++)
            {
                output += Array[index] + " ";
            }


            JOptionPane.showMessageDialog(null, output);

        }



    }

    public static int numGen()
    {
        int random = (int)(1+Math.random()*6);
        return random;
    }
}
Run Code Online (Sandbox Code Playgroud)

我一直在想它2个小时仍然无法生成6个数字而不重复.希望我的问题能得到解答.

顺便说一句,我是新的代码所以请我只想用for循环或while循环和它进行比较if else.

Tac*_*der 8

您可以从1到6生成数字(请参阅下面的另一个解决方案),然后执行a Collections.shuffle来随机播放您的数字.

    final List<Integer> l = new ArrayList<Integer>();
    for (int j = 1; j < 7; j++ ) {
        l.add( j );
    }
    Collections.shuffle( l );
Run Code Online (Sandbox Code Playgroud)

通过这样做,你最终得到一个从1到6的数字的随机列表,而没有两倍相同的数字.

如果我们分解解决方案,首先你有这个,这真的只是创建一个包含六个数字的列表:

    final List<Integer> l = new ArrayList<Integer>();
    for (int j = 1; j < 7; j++ ) {
        l.add( j );
    }
Run Code Online (Sandbox Code Playgroud)

所以在这一点上你有你在问题中提到的1-2-3-4-5-6列表.您可以保证这些数字不重复.

然后,您只需通过将每个元素与另一个元素交换至少一次来随机化/随机化该列表.这就是Collections.shuffle方法的作用.

您建议的解决方案不会非常有效:根据您的数字列表的大小和范围,您可能很有可能重复数字.在这种情况下,不断重新尝试生成新列表将会很慢.而且任何其他解决方案建议,以检查是否该列表中已经包含了一些防止重复或使用一套将是缓慢的,如果你有连续数一长列(比如说10万个的数字,从1到100 000名单) :你不断尝试随机生成尚未生成的数字,随着数字列表的增长,你会遇到越来越多的冲突.

如果你不想使用Collections.shuffle(例如用于学习目的),你仍然可能需要使用相同的想法:首先创建通过确认号码列表不会有任何重复,然后做一个for循环随机地交换两个列表中的元素.您可能希望查看以Collections.shuffle正确方式进行随机播放的方法的源代码.

编辑你的"随机数"的属性必须是什么不是很清楚.如果你不希望它们从1增加到6,你可以这样做:

final Random r = new Random();
final List<Integer> l = new ArrayList<Integer>();
for (int j = 0; j < 6; j++ ) {
    final int prev = j == 0 ? 0 : l.get(l.size() - 1);
    l.add( prev + 1 + r.nextInt(42) );
}
Collections.shuffle( l );
Run Code Online (Sandbox Code Playgroud)

请注意,通过更改r.nextInt(42)r.nextInt(1)您将有效地获得从1到6的非重复数字.