【问题标题】:How to make not generate a number twice? [duplicate]如何使不生成两次数字? [复制]
【发布时间】:2013-08-24 02:48:10
【问题描述】:

在我的程序中,我使用的是随机生成器。

Random random = new Random();

//How i use it
int i = random.nextInt(numberNeeded);

问题是,我需要找到一种方法,让每个数字只生成一次。所以我猜它不是完全随机的......例如......当生成数字 1 时,我不希望再次调用它,而是调用其他数字之一......比如 2,3 或 4 ...然后当 4 被调用时,它只能调用 2 或 3..

然后下一次数字被洗牌,然后重复这个过程......

数字需要介于 4 到 16 之间

【问题讨论】:

    标签: java android


    【解决方案1】:

    在要从中选择的元素列表中使用Collections.shuffle 可能会更容易:

    ArrayList<Integer> numbers = new ArrayList<Integer>();
    for (int i=4; i<=16; i++)
        numbers.add(i);
    Collections.shuffle(numbers);
    // numbers is now in a random order and contain the numbers 4 through 16
    

    【讨论】:

    • 那么我将如何从中生成一个随机数?比如 int = random.nextInt()
    • @coder_For_Life22 - 第一个随机数将是 numbers.get(0)second numbers.get(1) 等。
    【解决方案2】:

    首先确保您只在应用程序首次启动时执行一次new Random()

    其次,记住变量中的最后一个值,并永远循环,直到它不匹配为止。

    Random random = new Random();
    
    int lastNumber = -1;
    
    while (true)
    {
      int i = random.nextInt(numberNeeded);
      if (i == lastNumber) continue;
      lastNumber = i;
      break;
    }
    

    【讨论】:

    • 它在第一次迭代中失败,仅 bcoz 如果 i=4 第一次迭代然后 if(i==lastNumber) 返回 false,因为 i=4 和 lastNumber=-1 所以循环中断
    【解决方案3】:

    将数字 4 到 16 添加到 ArrayList,然后使用 Collections.shuffle(...) 对其进行随机播放。然后按ArrayList顺序返回

    【讨论】:

      【解决方案4】:

      您可以使用 Collections.shuffle...

                  //Setup your list as needed...
          final List<Integer> list = new ArrayList<Integer>(); 
          list.addAll(Arrays.asList(new Integer[] {
                  1, 2, 3, 4 }));
      
      
          // Randomizes the list
          Collections.shuffle(list);
      
          for (Iterator<Integer> i = list.iterator(); i.hasNext();) {
              System.out.println(i.next());
                          //Removes from the list...
              i.remove();
          }
      

      【讨论】:

        【解决方案5】:

        也许不是最好的方法,但最直接的方法是使用布尔数组。

        //create an array of boolean values set to TRUE
        boolean[] isavailable = new boolean[somesize];
        Arrays.fill(isavailable, Boolean.TRUE);
        
        //Get a random number
        Random r = new Random();
        int myrandomnumber=r.nextInt()%25; //Im just going to use 25 for example
        
        if (isavailable[myrandomnumber])
        {
           isavailable[myrandomnumber]=false;
           //do whatever you want with the number here
        }
        else
        {
             //Generate another random number here
        }
        

        老实说,最好将其放入 while 循环中,这样如果您连续生成两个以上不可用的数字,您就会被覆盖,但这应该会给您基本的想法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-06
          • 1970-01-01
          • 1970-01-01
          • 2017-11-26
          相关资源
          最近更新 更多