Создание нечетного случайного числа между заданным диапазоном

Как генерировать нечетное случайное число между заданным диапазоном..

для например: для ряда между 1 до 6 .. Случайный нет 3 или 1 или 5

метод генерации случайного No:

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

Refer как генерировать случайные целые числа в определенном диапазоне в Java?

Метод Генерации Нечетного Случайного 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;
          }
    }

эта функция всегда будет преобразовывать 2 в 3, а не 1 Можем ли мы сделать это более случайной функцией что может преобразовать 2 Иногда в 3, а иногда в 1 ??

10 ответов


предполагая, что 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 или J. A.


Как насчет проверки возврата из Math.random () как плавающее число. Если его часть int является четным числом, преобразуйте вверх / вниз на основе его плавающей части. Например:

предположим математике.random () возвращает x.y; если x четное, вернитесь (y>=0.5)?(x+1): (x-1)

будет ли это рандомизировано немного?


пусть rouding выше или ниже зависит от случайных Эпсилон.

    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 объясняется здесь. Также обратите внимание, что причина мы +1 к входу в ThreadLocalRandom.nextInt () должен убедиться, что max включен в диапазон.