如何限制Java随机数生成

时间:2014-06-07 13:51:32

标签: java random

这是交易:我有一个java代码,可以在两个数字之间生成一个随机数,它运行得很好。但我正在努力实现一些目标。我希望它能够在生成第一个数字之后,当它重新调用它时,它不会生成相同的数字。例如,如果生成了数字4,我现在希望它第二次包含在可能生成的数字中。为了使事情有点清楚,这是我的代码。

      int Maximum=10;
      int Minimum=1;
      int r;
      r = (int)(Math.random() * Maximum) + Minimum;

我能做些什么来使上面的代码不生成1到10之间的特定数字?感谢。

4 个答案:

答案 0 :(得分:2)

您可以填写一个集合,只需删除随机选择的数字:

List<Integer> nums = new ArrayList<>();
for (int i = /* start */; i < /* end */; i++) {
    nums.add(i);
}

//Elsewhere
Random rand = new Random();
int get = nums.remove(rand.nextInt(/* end */);
/* end */--;

对于大量数字,这可能会稍微慢一点,但最终结果是检查新数字时的时间复杂度较低(而理论上,如果我在某种情况下,while循环可以O(∞n)。我没弄错)

或者,使用Collections#shuffle

答案 1 :(得分:2)

这似乎不是随机数生成,似乎随机改组Collection

在Java 8中:

public static void main(String[] args) {
    final int min = 0;
    final int max = 10;
    final List<Integer> nums = IntStream.rangeClosed(min, max).
            boxed().
            collect(toList());
    Collections.shuffle(nums);
    nums.forEach(System.out::println);
}

输出:

3
10
5
0
8
7
9
2
1
4
6

每个号码[0, 10]只会以随机顺序出现一次。

答案 2 :(得分:0)

如果你只想排除一个数字,请替换它:

r = (int)(Math.random() * Maximum) + Minimum;

用这个:

while( ( r = (int)(Math.random() * Maximum) + Minimum) == excludedNumber );

答案 3 :(得分:-1)

    ArrayList<Integer> intList = new ArrayList<Integer>();

    int Maximum=10;
    int Minimum=1;
    int r;
    int[] intArray = new int[6];


    for(int i=0; i<intArray.length; i++){

        r = (int)( Minimum+ (Math.random()* (Maximum-Minimum+1)) );

        if(!intList.contains(r)){
            intList.add(r);
            intArray[i]=r;
            System.out.println(r);
        }
        else{
            System.out.println(r+ "is a duplicate generated earlier, not putting in array again");
            i--;
        }

    }