如何在给定范围之间生成奇数随机数..
对于Eg:范围在1到6之间.. 随机数为3或1或5
生成随机编号的方法:
Random_No = Min + (int)(Math.Random()*((Max-Min)+1))
参考How do I generate random integers within a specific range in Java?
生成奇数随机数的方法:
Random_No = Min + (int)(Math.Random()*((Max-Min)+1))
if(Random_No%2 ==0)
{
if((Max%2)==0)&&Random_No==Max)
{
Random_No = Random_No - 1;
}
else{
Random_No = Random_No +1;
}
}
此函数将始终将2转换为3而不是1 我们可以将它作为一个更随机的函数,有时可以将2转换为3,有时转换为1 ??
答案 0 :(得分:7)
假设max是包容性的,我建议如下:
if (Max % 2 == 0) --Max;
if (Min % 2 == 0) ++Min;
Random_No = Min + 2*(int)(Math.random()*((Max-Min)/2+1));
它导致所有奇数之间的均匀分布。
答案 1 :(得分:2)
如果你想在方向上包含随机性,也可以使用相同的随机数。
int randomDirection = Min + (int)(Math.Random()*((Max-Min)+1));
if(randomDirection%2==0) { // any condition to switch the direction
Random_No = Random_No + 1;
} else {
Random_No = Random_No - 1;
}
答案 2 :(得分:1)
不是生成介于0和6之间的随机数,而是生成介于0和5之间的随机数,然后向上舍入到最接近的奇数,这样就可以得到完美的分布(每种可能性为33%(1,3,5) ))
答案 3 :(得分:1)
为此,您需要生成第二个伪随机数以添加或减去1
Random_No = Min + (int)(Math.Random()*((Max-Min)+1))
repartitionNumber =(int)(Math.Random()*((2)) // between 0 and 1
if(Random_No%2 ==0)
{
if(Random_No+1<=Max && Random_No-1>=Min)
{
if(repartitionNumber==0)
Random_No = Random_No + 1;
else
Random_No = Random_No - 1;
}
else if(Random_No+1<=Max)
Random_No = Random_No + 1;
else if (Random_No-1>=Min)
Random_No = Random_No - 1;
}
答案 4 :(得分:1)
我想知道为什么其他答案都使用int cast来生成随机数。为什么不直接生成随机整数,这比实数方式更准确?
Random rn = new Random();
if(maximum % 2 == 1) maximum = maximum + 1; // turn right bound to even
if(minimum % 2 == 0) minimum = minimum - 1; // turn left bound to odd
int range = (maximum - minimum + 1) / 2;
int randomNum = rn.nextInt(range) * 2 + minimum;
答案 5 :(得分:1)
要从整数生成奇数,您可以使用n * 2 + 1
实际上您生成随机数并在之后应用转换
int num = min / 2 + random.nextInt((max + 1) / 2 - min / 2);
num = num * 2 + 1;
即使范围为[1,5] [2,5] [2,6] [1,6]
,这也会有效答案 6 :(得分:0)
数学上,数字在最后一步中向上或向下舍入不会获得任何结果。相反,第一个和最后一个数字的机会比其他所有数字都低50%。
坚持使用CrazyCasta或J.A的解决方案。
答案 7 :(得分:0)
如何将Math.random()的返回值作为浮点数检查。如果其int部分是偶数,则根据其浮动部分进行上/下转换。像:
假设Math.random()返回x.y;如果x是偶数,则返回(y> = 0.5)?(x + 1):( x-1)
这会随机化吗?
答案 8 :(得分:0)
让上面或下面的路由取决于随机的epsilon。
Random_No = Min + (int)(Math.Random()*((Max-Min)+1))
if(Random_No%2 ==0)
{
if((Max%2)==0)&&Random_No==Max)
{
Random_No = Random_No - 1;
}
else{
epsilon = Math.Random();
if(epsilon > 0.5)
Random_No = Random_No + 1;
else
Random_No = Random_No - 1;
}
}
答案 9 :(得分:0)
在Java 1.7或更高版本中,我会使用ThreadLocalRandom:
import java.util.concurrent.ThreadLocalRandom;
// Get odd random number within range [min, max]
// Start with an odd minimum and add random even number from the remaining range
public static int randOddInt(int min, int max) {
if (min % 2 == 0) ++min;
return min + 2*ThreadLocalRandom.current().nextInt((max-min)/2+1);
}
// Get even random number within range [min, max]
// Start with an even minimum and add random even number from the remaining range
public static int randEvenInt(int min, int max) {
if (min % 2 != 0) ++min;
return min + 2*ThreadLocalRandom.current().nextInt((max-min)/2+1);
}
使用ThreadLocalRandom的原因解释为here。另请注意,我们对ThreadLocalRandom.nextInt()的输入+1的原因是为了确保max包含在范围内。