Generating an Odd Random Number between a given Ra

2019-02-09 15:08发布

How to generate an odd Random number between a given range..

For Eg: For range between 1 to 6 .. Random No is 3 or 1 or 5

Method for Generating Random No :

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

Refer How do I generate random integers within a specific range in Java?

Method For Generating Odd Random No :

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

This Function will always convert 2 into 3 and not 1 Can we make this a more random function which can convert 2 sometimes into 3 and sometimes into 1 ??

标签: java math random
10条回答
太酷不给撩
2楼-- · 2019-02-09 15:24

Instead of generating a random number between 0 and 6, generate one between 0 and 5 and round up to the nearest odd number, that way you'll have a perfect distribution (33% for each possibility (1, 3, 5))

查看更多
聊天终结者
3楼-- · 2019-02-09 15:27

Let the rouding above or below depend on a random 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;
          }
    }
查看更多
地球回转人心会变
4楼-- · 2019-02-09 15:28

In Java 1.7 or later, I would use 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);
}

The reason to use ThreadLocalRandom is explained here. Also note that the reason we +1 to the input to ThreadLocalRandom.nextInt() is to make sure the max is included in the range.

查看更多
我想做一个坏孩纸
5楼-- · 2019-02-09 15:30

Assuming max is inclusive, I'd suggest the following:

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

It results in even distribution among all the odd numbers.

查看更多
forever°为你锁心
6楼-- · 2019-02-09 15:30

To generate an odd number from a integer you can use n * 2 + 1 Really you are generating random numbers and applying a transformation afterwards

int num = min / 2 + random.nextInt((max + 1) / 2 - min / 2);
num = num * 2 + 1;

This will work even if the range is [1,5] [2,5] [2,6] [1,6]

查看更多
Deceive 欺骗
7楼-- · 2019-02-09 15:32

How about checking the return from Math.random() as a floating number. If its int part is an even number, then convert up/down based on its floating part. Like:

assume Math.random() returned x.y; if x is even, return (y>=0.5)?(x+1):(x-1)

Will this randomized a little?

查看更多
登录 后发表回答