Получить случайное число из массива, без повтора (с таймером) - PullRequest
0 голосов
/ 08 октября 2019

Привет и Спасибо за чтение этого поста.

Я пытаюсь создать автоматическую игру чисел с громким вызовом в Бинго, но в журнале консоли я получаю неопределенное значение. Любые идеи?

У меня есть массив, этот элемент должен вызываться случайным образом без повторения, а когда закончите, остановитесь и произнесите что-то вроде "конец" или "конец".

Спасиботак много!

var nums = ["one","two","three","four","five","six","seven","eight","nine","ten"],
ranNums = [],
i = nums.length,
j = 0;

setInterval(getNum,2000);

function getNum(){
  j = Math.floor(Math.random() * (i+1));
  ranNums.push(nums[j]);
  nums.splice(j,1);
  console.log(ranNums[ranNums.length-1]);
}

Ответы [ 6 ]

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

Во-первых, метод splice () изменяет содержимое массива, удаляя или заменяя существующий. Соединение Вот почему вы получаете неопределенное значение (Потому что вы изменили начальную длину массива. Также, если вы немного поискали, вы можете найти Получение случайного целого числа между двумя значениями

Кроме того, вы не упомянули, когда вы хотите остановиться. Но ниже Бинго !!!

var nums = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"],
  ranNums = [],
  i = nums.length,
  j = 0;



setInterval(getNum2, 2000);

function getNum2() {
  var min = Math.ceil(null); //rounds a number up to the next largest whole number or integer
  var max = Math.floor(nums.length); // returns the largest integer less than or equal to a given number
  var rdNumber = Math.floor(Math.random() * (max - min)) + min;
  // You can set a rult when you want to stop for e.g 
  // if (ranNums.length === 5){ clearInterval(getNum2)}
  ranNums.push(nums[rdNumber]);
  console.log(nums[rdNumber]);

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

Проблема в том, что вы не изменяете переменную 'i' после объединения массива.

Например, ваш массив может в конечном итоге стать

nums = ["one","two","three","four","ten"]

, в то время как ваше «i» все еще равно 10, поэтому «j» может получить значения, которые слишком велики для вашего массива, что приводит квам не определено.

Чтобы решить эту проблему, заставьте 'i' получить новую длину массива или уменьшите ее на 1 в конце функции

0 голосов
/ 08 октября 2019

Я надеюсь, что это поможет вам:)

var nums = ["one","two","three","four","five","six","seven","eight","nine","ten"],
ranNums = [],
j = 0;

intervall = setInterval(getNum,2000);
  function getNum(){
  
    i = nums.length
    
    if(i == 0) {
      clearInterval(intervall)
      console.log('the end')
    } else {
        console.log(i)
        j = Math.floor(Math.random() * (i));
        ranNums.push(nums[j]);
        nums.splice(j,1);
        console.log(ranNums[ranNums.length-1]);
      }
   }
0 голосов
/ 08 октября 2019

Здесь есть пара ошибок. Вы не сбрасываете значение i здесь. Также Math.random * i вместо i+1

См. Код ниже для справки

var nums = ["one","two","three","four","five","six","seven","eight","nine","ten"],
ranNums = [],
i = nums.length,
j = 0;

setInterval(getNum,2000);

function getNum() {
    j = Math.floor(Math.random() * (i));
    // console.log(j);  
    ranNums.push(nums[j]);
    nums.splice(j,1);
    i = nums.length;
    let newValue = ranNums[ranNums.length-1];
    if (!newValue) {
        newValue = "The end!!"
    }
    console.log(newValue);
}
0 голосов
/ 08 октября 2019

Ваш код выглядит нормально, просто нужны обновления длиной nums с каждым всплывающим элементом. Вот один из способов сделать это.

var nums = ["one","two","three","four","five","six","seven","eight","nine","ten"],
ranNums = [],
i = nums.length,
j = 0;

setInterval(getNum,2000);

function getNum(){
  i=nums.length
  if(i!=0){
    j = Math.floor(Math.random() * (i));
    ranNums.push(nums[j]);
    nums.splice(j,1);
    console.log(ranNums[ranNums.length-1]);
  }else{
    alert('The end');
  }
}
0 голосов
/ 08 октября 2019

Вы можете использовать операнд, например:

    var nums = ["one","two","three","four","five","six","seven","eight","nine","ten"];
    var usedNums = [];
    while (nums.length) {
      var randomIndex = Math.floor(Math.random() * (nums.length - 1));
      var randomNumber = nums.splice(randomIndex, 1)[0];
      console.log('number ' + randomNumber.toString());
      usedNums.push(randomNumber);
    };
    console.log('nums end');
...