#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
Дополнительная информация: