在给定范围之间生成奇数随机数

如何在给定范围之间生成奇数随机数

对于Eg:范围在1到6之间。随机数为3或1或5

生成随机数的方法:

Random_No = Min + (int)(Math.Random()*((Max-Min)+1)) 

请参考如何在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?

假设max是包容性的,我建议如下:

 if (Max % 2 == 0) --Max; if (Min % 2 == 0) ++Min; Random_No = Min + 2*(int)(Math.random()*((Max-Min)/2+1)); 

它导致所有奇数之间的均匀分布。

如果要在方向上包含随机性,也要使用随机数。

  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; } 

不是生成0到6之间的随机数,而是在0到5之间生成一个并向上舍入到最接近的奇数,这样你就会得到一个完美的分布(每种可能性为33%(1,3,5))

为此,您需要生成第二个伪随机数以添加或减去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; } 

我想知道为什么其他答案都使用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; 

要从整数生成奇数,您可以使用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],这也会有效

在数学上,数字在最后一步中向上或向下舍入不会获得任何结果。 相反,第一个和最后一个数字的机会比所有其他数字低50%。

坚持使用CrazyCasta或JA的解决方案。

如何将Math.random()的返回值检查为浮点数。 如果其int部分是偶数,则根据其浮动部分进行上/下转换。 喜欢:

假设Math.random()返回xy; 如果x是偶数,则返回(y> = 0.5)?(x + 1):( x-1)

这个随机化了吗?

让上面或下面的路由取决于随机的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; } } 

在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的原因。 另请注意,我们对ThreadLocalRandom.nextInt()的输入+1的原因是为了确保max包含在范围内。