JSFiddle - React, Tailwind, and code Playground
HTML
<script src="https://unpkg.com/[email protected]/bignumber.js"></script>
<button>Сгенерировать следующее число</button>
<div id="list"></div>
CSS
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, 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;
}
JavaScript
BigNumber.config({ EXPONENTIAL_AT: [0, 1300] });
function getNonRepeatingNumberIterator() {
// const INITIAL_NUMBER = 1 + 1023 * Math.random() | 0;
// const INITIAL_NUMBER = 1 + 2047 * Math.random() | 0;
// const INITIAL_NUMBER = 1;
const INITIAL_NUMBER = new Uint8Array(4096);
INITIAL_NUMBER.forEach((v, i, a) => a[i] = 2 * Math.random());
console.log(INITIAL_NUMBER);
let s = getNextNumber(INITIAL_NUMBER);
function getNextNumber(s) {var base = 2;
// x^4096 + x^4095 + x^4081 + x^4069 + 1
let feedback = s[4096] ^ s[4095] ^ s[4081] ^ s[4069];
s.copyWithin(1, 0);
s[0] = feedback;
return s;
}
return {
next: function() {
// Даже если генерировать со скоростью 10^6 в секунду,
// потребуется около 3.30953661...*10^1219 лет
// т. е. во много раз больше многих миллионов и
// миллиардов лет, прежде чем тут снова появится
// число INITIAL_NUMBER, так что можно и не проверять.
// Хотя это пвевдо-случайная последовательность чисел,
// Math.random() каждое своё ~10^17 значение за тоже самое время
// успеет выдать ~10^1216 раз, так что эта
// последовательность является более «случайной»
// if(s.toString() === INITIAL_NUMBER.toString()) return {
// value: null,
// done: true
// };
s = getNextNumber(s);
return {
value: s,
done: false
};
}
};
}
// использование
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 = new BigNumber(iteratorStep.value.join(""), 2).toString();
list.appendChild(span);
});