[英]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.