Показать сообщение отдельно
  #3 (permalink)  
Старый 20.03.2019, 10:08
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

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>

Последний раз редактировалось Malleys, 20.03.2019 в 10:38.
Ответить с цитированием