0

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

Random random = new Random();

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

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

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

数字需要在 4 到 16 之间

4

5 回答 5

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
于 2013-08-24T02:53:00.687 回答
0

首先确保你new Random()只做一次,当你的应用程序第一次启动时。

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

Random random = new Random();

int lastNumber = -1;

while (true)
{
  int i = random.nextInt(numberNeeded);
  if (i == lastNumber) continue;
  lastNumber = i;
  break;
}
于 2013-08-24T02:52:50.467 回答
0

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

于 2013-08-24T02:55:19.960 回答
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();
    }
于 2013-08-24T02:58:38.930 回答
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循环中,这样如果你连续生成两个以上的不可用数字,你就会被覆盖,但这应该会给你一个基本的想法。

于 2013-08-24T03:48:29.333 回答