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

У меня есть функция, которая принимает пользовательский ввод, чтобы сообщить, сколько случайных чисел выводить, и диапазон, в котором между ними создаются случайные числа (скажем, 1-90). Проблема в том, что он даст повторные числа, но я хочу только уникальные числа. Кто-нибудь знает, как я могу изменить код для достижения этой цели?

function random() {
    let randomNums = [];

// Get how many random numbers to output
    let numBox = document.querySelector('.numBox').value;

// Get the highest number range should go to (ex. 1-70)
    let highestNumber = document.querySelector('.highestNumber').value;

// Loop to generate random numbers and push to randomNums array
    for (let i = 0; i < numBox; i++) {
        let num = Math.floor(Math.random() * highestNumber) + 1;
        randomNums.push(` ${num}`)  
    }     

// Sort numbers from lowest to highest
    randomNums.sort(function(a, b) {return a - b;});

// Output numbers
    document.querySelector('.randomOutput').innerHTML = randomNums;
}

Ответы [ 5 ]

1 голос
/ 07 октября 2019

Просто измените ваш цикл на цикл while и проверьте, не имеет ли массив этого значения:

let i = 0;
while(i < numBox) {
    let num = Math.floor(Math.random() * highestNumber) + 1;
    if (randomNums.indexOf(num) == -1) {
        randomNums.push(num);
        i++;
    }
}
0 голосов
/ 07 октября 2019

, как упомянул @CodeManiac, используя «Set» в решении @BilalSiddiqui.

let randomNums = new Set();
while(randomNums.size < 5) {
    let num = Math.floor(Math.random() * 10) + 1;
        randomNums.add(num);
}
console.log(randomNums)
0 голосов
/ 07 октября 2019

Это код, который исправил это, если у кого-то еще есть подобная проблема:

function random() {
    let randomNums = [];
    let included = {};
    let numBox = document.querySelector('.numBox').value;
    let highestNumber = document.querySelector('.highestNumber').value;

    for (let i =0; i<numBox; i++) {
        let temp = true;
        while(temp) {
            let num = Math.floor(Math.random() * highestNumber) + 1;
            if (included[num] === undefined) {
                temp = false
                randomNums.push(` ${num}`)
                included[num] = num
               }
        }
    }
    randomNums.sort(function(a, b) {return a - b;});
    document.querySelector('.randomOutput').innerHTML = randomNums;
}
0 голосов
/ 07 октября 2019

Вот подход, избегающий цикла while().

  1. Заполнение массива числами от 1 до максимального значения
  2. Рандомизация массива (я позаимствовал Fisher-Yates алгоритм из этот ответ )
  3. Выбрать первые N элементов из массива

function random() {
  let randomNums = [];

  // Get how many random numbers to output
  let numBox = document.querySelector('.numBox').value;

  // Get the highest number range should go to (ex. 1-70)
  let highestNumber = document.querySelector('.highestNumber').value;

  // Loop to generate random numbers and push to randomNums array
  for (let i = 1; i <= highestNumber; i++) {
    randomNums.push(i)
  }

  randomNums = shuffle(randomNums).slice(0, numBox);

  // Sort numbers from lowest to highest
  randomNums.sort(function(a, b) {
    return a - b;
  });

  // Output numbers
  document.querySelector('.randomOutput').innerHTML = randomNums;
}

function shuffle(a) {
  var j, x, i;
  for (i = a.length - 1; i > 0; i--) {
    j = Math.floor(Math.random() * (i + 1));
    x = a[i];
    a[i] = a[j];
    a[j] = x;
  }
  return a;
}

random();
<input class="numBox" value="4"> out of <input class="highestNumber" value="48">
<div class="randomOutput"></div>
<button onclick="random()">randomize</button>
0 голосов
/ 07 октября 2019

вы можете просто сгенерировать и проверить, существует ли он, пока не получите необходимые случайные уникальные числа

while (randomNums.length < numBox) {
    let num = Math.floor(Math.random() * highestNumber) + 1;
    if (randomNums.indexOf(num) === -1) randomNums.push(num);
}
...