Как генерировать случайные числа с определенным интервалом? - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть этот образец:

ссылка

КОД JS:

for (var i=0; i < 5; i++) {
  var number = 1 + Math.floor(Math.random() * 20);
  console.log(number);
}

Я хочу создать числаот 1 до 20, но со следующими ограничениями:

  1. Числа не должны дублироваться
  2. Исключить первый и последний numbet (1,20)
  3. Разницамежду сгенерированными числами должно быть не менее 3 (например: 4, 7,10 и т. д.)

Не могли бы вы дать мне несколько советов, как мне это сделать?

Несколькомне помогут простые примеры.

Спасибо

Ответы [ 3 ]

2 голосов
/ 30 сентября 2019

Вы можете оставить Set, чтобы проверить, сгенерировано ли уже число, и использовать рекурсию, если это так, а также для генерации чисел с разностью 3, просто умножьте и разделите числа на 3

Math.floor(Math.random() * 20)

let generateRandom = (function(limit) {
  let set = new Set([20]);
  return function getRandom() {
    let random = Math.floor(2 + Math.floor(Math.random() * 20 / 3) * 3);
    if (set.has(random)) {
      return getRandom()
    } else {
      set.add(random)
      return random
    };
  }
})()

console.log(Array(5).fill(null).map(generateRandom))

Примечание: Помните, что вы можете сгенерировать максимум 5 чисел с ограничением, не пытайтесь сгенерировать больше, иначе вы окажетесь на Range Error.

1 голос
/ 30 сентября 2019

Вы можете взять Set с возможными числами и взять одно из чисел. Затем удалите ненужные нижние и верхние значения. Повторяйте до желаемого количества.

function get5() {
    var numbers = new Set(Array.from({ length: 18 }, (_, i) => i + 2)),
        result = [],
        random,
        i = 5, j;

    while (i--) {
        random = [...numbers][Math.floor(Math.random() * numbers.size)];
        result.push(random);
        for (j = random - 2; j < random + 3; j++) numbers.delete(j);
    }
    if (result[4] === undefined) return get5();
    return result;
}

console.log(get5());
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 30 сентября 2019

попробуйте

var rendom = [];
while (rendom.length != 5) {
  var number = Math.floor(Math.random() * 18) + 2;
  let found = false;
  rendom.forEach(function(element) {
    if (element <= (number + 2) && element >= (number - 2)) {
      found = true;
    }
  });
  if (!found) {
    rendom.push(number);
  }
}

console.log(rendom);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...