Задать вопрос
dethain
@dethain
Верстальщик

Как сгенерировать нечётное рандомное число?

Мне нужна функция генерирующая случайное нечётное число в нужном диапазоне.
Например
console.log(randomEvenInt(1, 35)) // 7
console.log(randomEvenInt(1, 35)) // 1
console.log(randomEvenInt(1, 35)) // 17
console.log(randomEvenInt(1, 35)) // 15
  • Вопрос задан
  • 4299 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 1
twobomb
@twobomb
function randomEvenInt(min,max){
	let v  = Math.round(min+Math.random() * (max-min));
	return v%2 != 0?v:randomEvenInt(min,max);
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
sergiks
@sergiks Куратор тега JavaScript
♬♬
Если от min до max, включая max:
function randomOddInt(min, max) {  
  min = min & 1 ? min : min + 1;
  max = max & 1 ? max : max - 1;
  if (min === max) return min;
  if (min > max) throw "Invalid input";

  const range = 1 + (max - min) / 2;
  return min + Math.floor(Math.random() * range) * 2;
}
Ответ написан
Комментировать
@alexalexes
Нечетное число n можно выразить через параметр t:
n = 2* t - 1
Будем рандомизировать параметр t и переводить его в n, но нужны минимальное значение и максимальное.
min = 2 * t - 1, отсюда:
t_min = (min + 1) / 2
max = 2 * t - 1, отсюда:
t_max = (max + 1) / 2
Деление, скорее всего целочисленное.
Получается:
var n_random = 2 * randomEvenInt((min + 1) / 2,  (max + 1) / 2) - 1;
Ответ написан
Комментировать
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Если диапазон не будет выходить за пределы int32, то проще всего принудительно устанавливать нулевой бит в 1:
function randomEvenInt(min, max) {
  return (min + Math.random() * (max - min)) | 1;
}

Иначе можно проверять на четность и добавлять или отнимать единицу в случае четного результата:
function randomEvenInt(min, max) {
  const result = Math.floor(min + Math.random() * (max - min));
  return result + ((result % 2) - 1);
}
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
const randomEvenInt = (min, max) => 
  Math.floor(Math.random() * ((max - min) / 2 + 1)) * 2 + min
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы