如何不生成两次数字?

时间:2013-08-24 02:48:11

标签: java android

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

Random random = new Random();

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

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

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

数字需要介于4到16之间

5 个答案:

答案 0 :(得分:7)

在您要选择的元素列表中使用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

答案 1 :(得分:0)

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

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

Random random = new Random();

int lastNumber = -1;

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以使用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();
    }

答案 4 :(得分:0)

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

//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循环中,如果连续生成两个以上不可用的数字,那么你就会被覆盖,但这应该给你基本的想法。