Как сгенерировать числа, чтобы никогда не было обратного повтора?

#javascript

#javascript

Вопрос:

Я нашел следующий код в старой публикации стека. Не мог бы кто-нибудь рассказать мне, как этот код гарантирует, что числа в заданном диапазоне (0 — 4) никогда последовательно не повторяются.

 var getNumber = (function() { 
    var previous = NaN;
  
  return function() {
    var min = 0;
    var max = 4   (!isNaN(previous) ? -1 : 0);
    var value = Math.floor(Math.random() * max);
  
    if (value >= previous) {
       value  = 1;
    }
       previous = value;
       return value;
   };
  })();
  
for (var i = 0; i < 100; i  ) {console.log(getNumber());}  

Ответ №1:

 var getNumber = (function() {
  var previous = NaN;

  return function() {
    var min = 0;
    // if previous is a number
    // max = (4 - 1); max = 3
    // if previous is not a number
    // max = 4;
    // Actually the max will always be 3 except the first value
    var max = 4   (!isNaN(previous) ? -1 : 0);

    // value < 4 or value < 3, value will integer between 0-4, or 0-3 depend on the max number is 4 or 3
    var value = Math.floor(Math.random() * max);
    // value will always less than 3, except the first time less than 4
    if (value >= previous) {
    // value >= previous, include value = previous, so it will not repeat
      value  = 1; // (0 - 2)   1 will be (1 - 3)
    }
    previous = value;
    return value;
  };
})();

for (var i = 0; i < 100; i  ) {
  ` console.log(getNumber()); }`
  

Ответ №2:

Приведенный выше код демонстрирует алгоритм для предотвращения обратного повторения с использованием шаблона IIFE Javascript.

Алгоритм, позволяющий избежать обратного повторения, таков:

  • Шаг 1: Сгенерируйте случайное целое число ниже 5.
  • Шаг 2: Продолжайте генерировать новое случайное число, если оно не совпадает с предыдущим.
  • Шаг 3: Выведите новое значение

Интересные моменты, на которые следует обратить внимание:

Шаблон var x = function() { // some code... }() называется ‘Немедленно вызываемым функциональным выражением (IIFE)‘ в Javascript.

Этот шаблон используется для определения переменной как результата некоторой функции, которая будет выполнена перед инициализацией переменной.

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

Вот упрощенная версия кода, без ненужных инструкций, которая подчеркивает работу шаблона IIFE для генерации случайных чисел:

 // File name: no-repeat-demo.js

var getNumber = (
    function() { 
        var previous = NaN
        return (
            function() {
                var value = Math.floor(Math.random() * 5)
                while (value == previous) {
                    value = Math.floor(Math.random() * 5)
                }
                previous = value
                return value
            }
        )
    }
)()

for (var i = 0; i < 10; i  ) {
    console.log(getNumber())
}
  

Вывод:

 >node no-repeat-demo.js
1
2
3
2
3
2
3
1
3
4
  

Дополнительная информация:

https://developer.mozilla.org/en-US/docs/Glossary/IIFE