【问题标题】:How do i avoid getting same number in my Int Array?如何避免在我的 Int 数组中获得相同的数字?
【发布时间】:2015-04-06 19:28:51
【问题描述】:

您好,如何避免在我的代码中出现重复的“彩票”?

现在的问题是一切正常,排序,随机数,将其制成字符串。 问题是,例如,如果我想要 5 张彩票而不是我将打印出 5 张彩票

例子

Lottery tickets: 
--------------
[5, 13, 18, 22, 23, 23, 30]
[4, 7, 10, 12, 16, 26, 32]
[3, 5, 9, 22, 23, 25, 34]
[4, 5, 15, 18, 19, 19, 26]
[3, 3, 12, 14, 23, 26, 35] (Duplicate 3)
[5, 6, 12, 13, 14, 15, 26]

正如您所见,有重复的数字,我想避免这种情况,所以它总是随机的。如何避免这种情况?

import java.util.Arrays;
import java.util.Scanner;


public class Alt2 {

public static void main(String[] args) {
    System.out.print("How many lottery tickets do u want?: \n");
    Scanner svar= new Scanner(System.in);
    int nr = svar.nextInt();
    System.out.println("Lottery tickets: ");
    System.out.println("--------------");
    for(int i=0; i<nr; i++)  
    {  
        Alt2 t = new Alt2();

        int[] lottoNummer = t.BubbleSort();
        System.out.print(Arrays.toString(lottoNummer));


        System.out.println();
        svar.close();
    }  

}  
private int[] getTicket(){


int[] lottoNummer = new int[7];



lottoNummer[0] = (int) ((35 * Math.random()) + 1);  
lottoNummer[1] = (int) ((35 * Math.random()) + 1);  
lottoNummer[2] = (int) ((35 * Math.random()) + 1);  
lottoNummer[3] = (int) ((35 * Math.random()) + 1);  
lottoNummer[4] = (int) ((35 * Math.random()) + 1);  
lottoNummer[5] = (int) ((35 * Math.random()) + 1);
lottoNummer[6] = (int) ((35 * Math.random()) + 1);



return lottoNummer;  

}

public int[] BubbleSort( )
{
     int j;
     boolean flag = true;   
     int temp;   
     Alt2 t = new Alt2();
     int[] lottoNummer = t.getTicket();

     while ( flag )
     {
            flag= false;    
            for( j=0;  j < lottoNummer.length -1;  j++ )
            {
                   if ( lottoNummer[ j ] > lottoNummer[j+1] )   
                   {
                           temp = lottoNummer[ j ];                
                           lottoNummer[ j ] = lottoNummer[ j+1 ];
                           lottoNummer[ j+1 ] = temp;
                          flag = true;                
                  } 
            } 
      } 
     return lottoNummer;
} 



}

【问题讨论】:

标签: java arrays int duplicates


【解决方案1】:

您可以将排序后的数字 1 到 35 放入 arrayList 中,将它们打乱,然后从列表中取出前 7 个数字。

//define ArrayList to hold Integer objects
 ArrayList<Integer> numbers = new ArrayList<Integer>();

 for(int i = 0; i < 35; i++)
 {
   numbers.add(i+1);
 }

 Collections.shuffle(numbers);

【讨论】:

    【解决方案2】:

    我建议在开始时创建一个大小为 0 的 int 数组。然后,创建一个循环来生成你的随机数,另一个内部循环遍历数组并检查随机数是否已经存在。如果是,则将主循环索引减 1。如果不是,则创建一个大小为主数组 + 1 的临时数组,对主数组的大小进行循环,将值传输到临时数组并移出循环将最后一个随机数添加到主数组的长度索引中。

    只是一个例子:

            int[] nums = new int[0];
            Random rnd = new Random();
            for (int i = 0; i < 30; i++)
            {
                bool dup = false;
                int rand = rnd.Next(1, 99);
                for (int j = 0; j < nums.Length; j++)
                {
                    if (nums[j] == rand)
                    {
                        i--;
                        dup = true;
                        break;
                    }
                }
                if (!dup)
                {
                    int[] tmp = new int[nums.Length+1];
                    for (int j = 0; j < nums.Length; j++)
                        tmp[j] = nums[j];
                    tmp[nums.Length] = rand;
                    nums = tmp;
                }
            }
    

    它未经测试,我只是写了它。希望对你有帮助。

    【讨论】:

      【解决方案3】:

      这个怎么样:

      用 1 到 35 的整数创建一个数组列表:

      ArrayList<Integer> list = new ArrayList<Integer>();
      
      for (int i = 0; i < 36; i++) {
        list.add(new Integer(i));
      }
      

      然后从这个列表中抽取一个随机数,并将其从列表中移除:

      lottoNummerIndex = (int) ((35 * Math.random()) + 1);
      lottoNummer[0] = list.get(lottoNummerIndex);
      list.remove(lottoNummerIndex);
      

      从剩余的列表中抽取下一个数字:

      lottoNummerIndex = (int) ((34 * Math.random()) + 1);
      lottoNummer[1] = list.get(lottoNummerIndex);
      list.remove(lottoNummerIndex);
      

      重复这个直到:

      lottoNummerIndex = (int) ((29 * Math.random()) + 1);
      lottoNummer[6] = list.get(lottoNummerIndex);
      list.remove(lottoNummerIndex);
      

      现在您的数组 lottoNummer 包含 7 个不同的数字。

      【讨论】:

      • 请注意,在每次下一次抽奖时,我们都会少一个数字,所以当您抽到第二个数字时,您将随机数乘以 34,再乘以 33。
      • hmm .. 做到了,它仍然给我重复:/ [2, 2, 6, 7, 22, 26, 33]
      • 对不起,我错了:我们应该使用我们绘制的数字作为数组列表中下一个随机数的索引,所以:lottoNummerIndex = (int) ((35 * Math.random( )) + 1); lottoNummer[0] = list.get(lottoNummerIndex); list.remove(lottoNummerIndex);
      • 谢谢老兄!!你最好的:)
      【解决方案4】:

      @爱德华·奥洛夫斯基

      所以我错了

      ArrayList<Integer> list = new ArrayList<Integer>();
      
      for (int i = 0; i < 36; i++) {
        list.add(new Integer(i));
      }
      
      lottoNummer[0] = (int) ((35 * Math.random()) + 1);  
      list.remove(lottoNummer[0]);
      lottoNummer[1] = (int) ((35 * Math.random()) + 1); 
      list.remove(lottoNummer[1]);
      lottoNummer[2] = (int) ((35 * Math.random()) + 1); 
      list.remove(lottoNummer[2]);
      lottoNummer[3] = (int) ((35 * Math.random()) + 1); 
      list.remove(lottoNummer[0]);
      lottoNummer[4] = (int) ((35 * Math.random()) + 1);  
      list.remove(lottoNummer[4]);
      lottoNummer[5] = (int) ((35 * Math.random()) + 1);
      list.remove(lottoNummer[5]);
      lottoNummer[6] = (int) ((35 * Math.random()) + 1);
      list.remove(lottoNummer[6]);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-07
        • 1970-01-01
        • 2012-12-08
        • 2022-01-17
        • 1970-01-01
        • 1970-01-01
        • 2021-04-22
        • 2021-10-19
        相关资源
        最近更新 更多