繁体   English   中英

我如何限制Java随机数的生成

[英]How do i restrict a Java random number generation

达成协议:我有一个Java代码,可以在两个数字之间生成一个随机数,并且工作得很好。 但是我正在努力实现目标。 我想要这样一种方式:在生成第一个数字之后,当它调用它时,它不会生成相同的数字。 例如,如果生成了数字4,我现在希望第二次将其包含在可能生成的数字中。 为了使事情更清楚一点,这是我的代码。

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

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

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

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

这似乎不像是随机数的产生,似乎是随机地对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]仅以随机顺序出现一次。

如果您只想排除单个数字,请替换为:

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

有了这个:

while( ( r = (int)(Math.random() * Maximum) + Minimum) == excludedNumber );
    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--;
        }

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM