Java:固定范围内不包括指定数的随机数
Java: Random number in fixed range excluding specified number
在我的 (Java Android) 游戏中,我在随机位置生成金币。
硬币可以出现在屏幕上 6 个水平位置之一(每个水平最多 2 个)。
我所做的是为第一个硬币创建一个介于 0 和 5 之间的随机数,然后我想生成另一个随机数 不包括第一个硬币的位置。
因此,例如,硬币 1 生成在 0 到 5 之间的随机位置 - 假设是 4。
那么下一个硬币需要能够在0-3或者5之间进行选择。(基本上是0-5不包括4)
我已经设法做到了,但它不是很优雅,我相信一定有一个 better/cleaner 方法来实现它,但是,它让我逃脱了。
下面代码中的 random(int number) 方法只是 returns 从 0 到 number-1 的随机整数(使用 nextInt)和 randomBool() 只是 returns随机布尔值
此外,请记住,如果生成的随机数与我们试图避免的随机数相等,我不想使用任何不断重新生成随机数的技术。
代码
//Return a random number between 0 and 5 excluding the specified number
private int getRandomExcluding(int excludedNumber){
//If previous position was 0 then generate a number between 1 and 5
if (excludedNumber==0){
return random(5)+1;
}
//If position was 5, then generate and return number from 0-4
else if (excludedNumber==5){
return random(5);
}
//If number isn't 0 or 5 (then it is in range of 1-4 use a random bool to determine
// if we are going to get a number less than or greater than the number we are excluding
//True - get number lower than excluded number
else if(randomBool()){
//Excluded number is 1
if (excludedNumber==1){
return 0; //Only posibility
}
//Excluded number is > 1
else {
//Return a random number between 0 (inclusive) and the excluded number (exclusive)
return random(excludedNumber);
}
//False - get number higher than the excluded number (between exludedNumber+1 (inclusive) and 6(exlusive))
else {
return random(6-(excludedNumber+1))+(excludedNumber+1);
}
}
试试这个解决方案:
private int getRandomExcluding(int excludedNumber){
int num = random(5);
return num >= excludedNumber ? num+1 : num;
}
它只是生成从 0 到 4 的随机数,如果它大于或等于排除的数字,它会加一。这样所有五个可能的数字都是均匀分布的(如果你的 RNG 产生均匀分布的数字)。
您可以填充一个列表并将其随机排列:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Collections.shuffle(numbers);
int coin1 = numbers.get(0);
int coin2 = numbers.get(1);
解决方案:(如果您喜欢这种输入方式,可以将 List<Integer> excludes
更改为 int... excludes
)
/**
* Get a random number between a range and exclude some numbers
*
* @param start start number
* @param end end number
* @param excludes list of numbers to be excluded
* @return value between {@code start} (inclusive) and {@code end} (inclusive)
*/
private int getRandomWithExclusion(int start, int end, List<Integer> excludes) {
Collections.sort(excludes); // this method only works with sorted excludes
int random = start + new Random().nextInt(end - start + 1 - excludes.size());
for (int exclude : excludes) {
if (random < exclude) {
break;
}
random++;
}
return random;
}
在我的 (Java Android) 游戏中,我在随机位置生成金币。
硬币可以出现在屏幕上 6 个水平位置之一(每个水平最多 2 个)。
我所做的是为第一个硬币创建一个介于 0 和 5 之间的随机数,然后我想生成另一个随机数 不包括第一个硬币的位置。
因此,例如,硬币 1 生成在 0 到 5 之间的随机位置 - 假设是 4。
那么下一个硬币需要能够在0-3或者5之间进行选择。(基本上是0-5不包括4)
我已经设法做到了,但它不是很优雅,我相信一定有一个 better/cleaner 方法来实现它,但是,它让我逃脱了。
下面代码中的 random(int number) 方法只是 returns 从 0 到 number-1 的随机整数(使用 nextInt)和 randomBool() 只是 returns随机布尔值
此外,请记住,如果生成的随机数与我们试图避免的随机数相等,我不想使用任何不断重新生成随机数的技术。
代码
//Return a random number between 0 and 5 excluding the specified number
private int getRandomExcluding(int excludedNumber){
//If previous position was 0 then generate a number between 1 and 5
if (excludedNumber==0){
return random(5)+1;
}
//If position was 5, then generate and return number from 0-4
else if (excludedNumber==5){
return random(5);
}
//If number isn't 0 or 5 (then it is in range of 1-4 use a random bool to determine
// if we are going to get a number less than or greater than the number we are excluding
//True - get number lower than excluded number
else if(randomBool()){
//Excluded number is 1
if (excludedNumber==1){
return 0; //Only posibility
}
//Excluded number is > 1
else {
//Return a random number between 0 (inclusive) and the excluded number (exclusive)
return random(excludedNumber);
}
//False - get number higher than the excluded number (between exludedNumber+1 (inclusive) and 6(exlusive))
else {
return random(6-(excludedNumber+1))+(excludedNumber+1);
}
}
试试这个解决方案:
private int getRandomExcluding(int excludedNumber){
int num = random(5);
return num >= excludedNumber ? num+1 : num;
}
它只是生成从 0 到 4 的随机数,如果它大于或等于排除的数字,它会加一。这样所有五个可能的数字都是均匀分布的(如果你的 RNG 产生均匀分布的数字)。
您可以填充一个列表并将其随机排列:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Collections.shuffle(numbers);
int coin1 = numbers.get(0);
int coin2 = numbers.get(1);
解决方案:(如果您喜欢这种输入方式,可以将 List<Integer> excludes
更改为 int... excludes
)
/**
* Get a random number between a range and exclude some numbers
*
* @param start start number
* @param end end number
* @param excludes list of numbers to be excluded
* @return value between {@code start} (inclusive) and {@code end} (inclusive)
*/
private int getRandomWithExclusion(int start, int end, List<Integer> excludes) {
Collections.sort(excludes); // this method only works with sorted excludes
int random = start + new Random().nextInt(end - start + 1 - excludes.size());
for (int exclude : excludes) {
if (random < exclude) {
break;
}
random++;
}
return random;
}