7

如何在给定范围内生成奇数随机数..

例如:对于 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 吗?

4

10 回答 10

7

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

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

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

于 2012-09-26T05:22:37.413 回答
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;  
  }
于 2012-09-26T05:21:56.287 回答
1

与其生成 0 到 6 之间的随机数,不如生成 0 到 5 之间的随机数并四舍五入到最接近的奇数,这样您就可以得到完美的分布(每种可能性 33%(1、3、5))

于 2012-09-26T05:21:20.027 回答
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;
}
于 2012-09-26T05:29:05.073 回答
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;
于 2012-09-26T05:34:23.273 回答
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],这也会起作用

于 2012-09-26T07:17:55.737 回答
0

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

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

于 2012-09-26T05:26:14.150 回答
0

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

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

这会随机化一点吗?

于 2012-09-26T05:31:09.000 回答
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;
          }
    }
于 2013-05-13T19:37:19.517 回答
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 的原因。另请注意,我们对 ThreadLocalRandom.nextInt() 的输入 +1 的原因是确保最大值包含在范围内。

于 2017-03-31T04:59:17.177 回答