2

How can I make sure that a random number is only generated once?

For example:

for(int i = 0; i<len; i++)
    {
        while (rands.contains(rand = r.nextInt(len-2)+1));
        rands.add(rand);
        System.out.print ("Rand ___ " + rand + "___");
    }

How can I make sure that if the number 2 is generated from rand, it wont be generated again?

I apologise if i am not making myself clear enough. Please comment if you require any more information.

Thanks.

4

5 回答 5

1

您必须存储您生成的所有数字,并检查新的数字。HashSet出于性能考虑使用 a :

HashSet<Integer> rands = new HashSet<Integer>();
for(int i = 0; i<3; i++)
{
   int rand;
   while (rands.contains(rand = r.nextInt(3)))
       ;
   rands.add(rand);
}
于 2012-07-30T19:39:52.370 回答
1

使用 Random API 时,您无法真正限制这一点。可能您需要保留已生成数字的列表,如果尚未生成,则返回该数字。

于 2012-07-30T19:37:28.000 回答
0

您需要为此使用洗牌算法。从 1 开始。创建一个从 1 到 1000(任意大小)的整数数组。洗好阵列。继续从洗牌的数组中获取,直到你用完它们。当您通过 1000 时,使用 1000-2000 重新填充数组,随机播放并使用。根据需要多次重复该过程。

于 2012-07-30T19:44:07.763 回答
0

如果您只需要某个范围内的非重复随机数流,您可以执行以下操作:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

public class RandomNumberStream {
    private Iterator<Integer> numbers;

    public RandomNumberStream(int range) {
        List<Integer> numbersList = new ArrayList<>(range);
        for(int i = 0; i < range; i++) {
            numbersList.add(i);
        }
        Collections.shuffle(numbersList);
        numbers = numbersList.iterator();
    }

    public int nextNumber() {
        if(!numbers.hasNext()) {
            throw new IllegalStateException("No more numbers...");  //you might want to handle this differently
        }
        return numbers.next();
    }

    public static void main(String[] args) {
        RandomNumberStream rand = new RandomNumberStream(5);

        for(int i = 0; i < 5; i++) {
            System.out.println(rand.nextNumber());
        }
    }
}
于 2012-07-30T19:46:37.450 回答
0

我假设您想以随机顺序创建一个从 0-2 的数字列表(如果我错了,请告诉我)

您真正想要的是创建这些数字的列表

ArrayList<Integer> randomNums = ArrayList<Integer>() {{ add(0); add(1); add(2); }}

然后Collections用来洗牌。

Collections.shuffle(randomNums)
于 2012-07-30T19:40:12.120 回答