https://javascript.ru/forum/misc/713...tml#post469750
UPD
Теперь в JS доступны генераторы, так что ещё можно так...
На этот раз генерируем числа в диапазоне [1, 2**10 - 1]. Согласно
таблице, для n = 10 степенями LFSR-2 являются 10 и 7. Вы можете подставить другие значения в зависимости от диапазона! (Эти степени указаны в скрипте на 50-ой строке)
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<style>
button {
--theme: #f06;
background-color: white;
color: var(--theme);
border: 2px solid var(--theme);
padding: 1em;
border-radius: 0.25em;
font: bold 1.25em Helvetica, sans-serif;
transition: 400ms;
}
button:hover {
box-shadow: inset 0 0 0 3em var(--theme);
color: white;
}
#list {
display: flex;
font: 1em "Helvetica Neue", "Segoe UI", Roboto, Ubuntu, sans-serif;
flex-direction: column-reverse;
counter-reset: generated-number 0;
}
#list span {
display: flex;
counter-increment: generated-number 1;
padding: 1em;
border: 1px solid #eee;
border-radius: 5px;
margin: 0.5em 0;
word-break: break-all;
}
span::before {
content: counter(generated-number) ". ";
padding: 0 1em;
word-break: normal;
}
</style>
</head>
<body>
<button>Сгенерировать следующее число</button>
<div id="list"></div>
<script>
function* getNonRepeatingNumberIterator() {
const lfsr2 = [10, 7];
const INITIAL_NUMBER = 1 + (Math.pow(2, lfsr2[0]) - 1) * Math.random() | 0;
console.log(INITIAL_NUMBER);
let s = INITIAL_NUMBER;
function getNextNumber(s) {
// x**lfsr2[0] + x**lfsr2[1] + 1 = 0
return ((((s >> 0) ^ (s >> (lfsr2[0] - lfsr2[1]))) & 1) << (lfsr2[0] - 1)) | (s >> 1);
}
do yield s = getNextNumber(s); while(s !== INITIAL_NUMBER);
}
// использование
let iterator = getNonRepeatingNumberIterator();
let iteratorStep;
let list = document.getElementById("list");
document.querySelector("button").addEventListener("click", event => {
iteratorStep = iterator.next();
if(iteratorStep.done) return;
let span = document.createElement("span");
span.textContent = iteratorStep.value;
list.appendChild(span);
});
</script>
</body>
</html>