Java 数组中的随机数

Java 数组中的随机数,java,arrays,algorithm,random,Java,Arrays,Algorithm,Random,我需要用一个可能的50中的5个随机数填充数组A。允许重复。然后,我需要第二次填充同一个数组,但要使用在第一次或第二次填充数组时没有出现的唯一数字。我正在使用下面的代码第二次生成数组。我一直在研究如何同时搜索第一个数组中的重复项。感谢您的帮助!谢谢 boolean drawn; for (int i=0; i<A.length; i++) { do { drawn = false;

我需要用一个可能的50中的5个随机数填充数组A。允许重复。然后,我需要第二次填充同一个数组,但要使用在第一次或第二次填充数组时没有出现的唯一数字。我正在使用下面的代码第二次生成数组。我一直在研究如何同时搜索第一个数组中的重复项。感谢您的帮助!谢谢

boolean drawn;
    for (int i=0; i<A.length; i++) {
            do {
                    drawn = false;
                    A[i] = 1 + (int)(Math.random() * 50);


                    for (int j=0; j<i; j++)
                            if (A[i] == A[j]) 
                                drawn = true;                                                                               

            } while (drawn);
布尔绘制;
对于(int i=0;i使用列表跟踪所有允许的数字,并在使用时将其从列表中删除。然后,对于“第二次传递”,不要总是获取随机数*50,而是获取随机数*List size()。然后实际使用的数字是List.get(location),而不仅仅是number


(您的列表将以1,2,3,4,5开始,但当使用3时,列表将变为1,2,4,5,…,因此当您得到下一个“random()”数字3时,实际上是一个4。)

将您的50个候选随机数存储在大小为
50
的数组中

将计数器初始设置为
random.length
。因此,此处
计数器将初始化为49

然后从
0
counter-1
生成一个数字
r
,并选择
random[r]
作为您的数字

现在继续,用
random[counter-1]
交换
random[r]
。减量
counter
,这样下次您将只搜索数组的前49个元素,并在选择数字时继续此过程

现在,如果您想要一个以前没有选择过的数字,只需将
r
0
生成到
counter-1
,这样
random[r]
就来自数组中最开始的唯一元素

    int[] randoms= new int[50];
     .
     .  //populate your array with the candidate numbers
     .
    int counter= randoms.length;
    Random rand = new Random();

    public int getUnique(){
      //Get a random number in the range 0 to counter-1
      int r = rand.nextInt(counter);
      int myElement = randoms[r];
      randoms[r] = randoms[counter-1];
      randoms[counter-1]= myElement;
      counter--;
      return myElement; 
    }
当您想要允许重复时,从
0
random.length-1
生成一个
r
,并选择
random[r]
作为您的号码。请注意,我们仍然需要跟踪所使用的号码,以便
getUnique()
仍然有效:

    public int getAny(){
      //Get a random number in the range 0 to random.length-1
      int r = rand.nextInt(random.length);
      int myElement = randoms[r];
      if(r < counter){
        randoms[r] = randoms[counter-1];
        randoms[counter-1]= myElement;
        counter--;
      }
      return myElement; 
    }
public int getAny(){
//获取0到random.length-1范围内的随机数
int r=rand.nextInt(随机长度);
int myElement=randoms[r];
if(r<计数器){
随机数[r]=随机数[counter-1];
随机[counter-1]=myElement;
计数器--;
}
返回元素;
}

您可以创建一个包含50个数字的列表,并使用随机数获得0到50之间的5个索引,以创建第一个随机数组


对于第二步,创建第一个列表的副本,但删除第一个随机数组中的数字。然后洗牌第二个列表(使用
Collections.shuffle()
),并获取前5个元素。

由于需要存储以前的数组元素,因此每次填充数组时都必须使用一个额外的数组。例如:

boolean drawn;
System.arraycopy( A, 0, B, 0, A.length );
for (int i=0; i<A.length; i++) {
        do {
                drawn = false;
                A[i] = 1 + (int)(Math.random() * 50);

                for (int j=0; j<A.length; j++)
                        if (A[i] == B[j]) 
                            drawn = true; 

                for (int j=0; j<i; j++)
                        if (A[i] == A[j]) 
                            drawn = true;                                                                               

        } while (drawn);
布尔绘制;
数组复制(A,0,B,0,A.长度);
对于(int i=0;i我会这样做:

List<Integer> choices = new ArrayList<Integer>();  
Random r = new Random();
for(int i = 0; i <N;i++)
{  
    choices.add(r.nextInt(N-1)+1;
}    
Set<Integer> uniques = new HashSet<Integer>();  
Collections.shuffle(uniques);  
//remove first 5 entries from uniques 
//repeat for second pass  
List choices=new ArrayList();
随机r=新随机();

对于(int i=0;我将在纸上绘制逻辑。您可以使用if-then逻辑,尽管我认为有很多方法可以简化此CATI。如果您使用
列表
而不是数组,您可以利用该方法。@user1930614。不要只是复制代码。尝试了解到底发生了什么。这将对您的长期发展有所帮助。