这是交易:我有一个java代码,可以在两个数字之间生成一个随机数,它运行得很好。但我正在努力实现一些目标。我希望它能够在生成第一个数字之后,当它重新调用它时,它不会生成相同的数字。例如,如果生成了数字4,我现在希望它第二次包含在可能生成的数字中。为了使事情有点清楚,这是我的代码。
int Maximum=10;
int Minimum=1;
int r;
r = (int)(Math.random() * Maximum) + Minimum;
我能做些什么来使上面的代码不生成1到10之间的特定数字?感谢。
答案 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--;
}
}