Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Хочу получить рандомное не повт. число. (https://javascript.ru/forum/events/77059-khochu-poluchit-randomnoe-ne-povt-chislo.html)

Володимир 20.03.2019 03:49

Хочу получить рандомное не повт. число.
 
var num = 3;
var last = []
function pusk(){
    for(var a = 0; a < 4; a++){
 function randomNumbe (){
    return Math.floor(Math.random()*3);
}


var randoM = randomNumbe; 
var neW = randoM(num); //1
if(last.length === 0){      //2
    last.unshift(10)
}

var l = last.length
for(var a = 0; a < l; a++){ //3
    if(neW === last[a]){
return pusk()
    }
}
for(var k = 0; k < l; k++){//4
    if(neW !== last[k]){
        last.unshift(neW)
        break;
            }
}
    }
document.getElementById("pasha").addEventListener("click",pusk)
// for( var i = 0; i < num.length; i++){
//    if(neW === num[i]){
//     num.splice(neW,1)
//        alert(num)
//    }
// }
}

1.Получаю ранд число

2.Это делается для того, чтобы добавить просто любое число в массив, чтобы он не был пустой и цикл for мог заработать (может как-то можно обойтись и без этого, подскажите)

3.Прошел по массиву и проверяю или новое число равно хотя бы одному прошлом числу, если да то функция запускается заново,пока не выпадет полн. новое число. Тут работает все прекрасно условие и шаг выполняются и проверяются после каждого ++.


4.В этом шаге выполняются аналогичные процессы только проверяется,
если новое число не равно ни в коем случае старом, то оно добавляется в массив last.
Проблема в том, что условие и шаг цикла не выполняется, итерация не происходит и не проверяется условие после каждого ++. Помогите очень вас прошу.
Извините за такое написание кода, делаю в спешке

рони 20.03.2019 07:31

Володимир,
создай массив с нужными числами и перемешай

Malleys 20.03.2019 10:08

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>

Володимир 20.03.2019 11:34

Через метод contact или как?
И можете мне обьяснить почему второй for не хочет работать???
Очень вас прошу

Володимир 20.03.2019 11:35

Спасибо,вам канешно,но для меня,сложно понять даный код(

рони 20.03.2019 16:33

Володимир,
<!DOCTYPE html>

<html>
<head>
        <title>Untitled</title>
        <meta charset="utf-8">


</head>

<body>
<button id="pasha">click</button>
<output id="out">
<script>
var num = 3;
var last;
var arr = [];
function randomNumbe() {
    return Math.floor(Math.random() * num);
}
function pusk() {
    if (arr.length === 0) {
        rnd: for (var a = 0; a < num; a++) {
            var randoM = randomNumbe();
            if (last === randoM) {
                a--;
                continue rnd;
            }
            for (var i = 0; i < arr.length; i++) {
                if (arr[i] === randoM) {
                    a--;
                    continue rnd;
                }
            }
            arr.push(randoM);
            last = void 0;
        }
    }
    last = arr.shift();
    document.getElementById("out").innerHTML += " " + last;
}
document.getElementById("pasha").addEventListener("click", pusk);
</script>
</body>
</html>

SuperZen 20.03.2019 17:37

<script>

  function uniqueArray(count, maxNumber) {
    if (count > maxNumber) return new Error('count > maxNumber')
    const tmp = []
    while (count) {
      const n = parseInt(Math.random() * maxNumber)
      !tmp.includes(n) && (tmp.push(n), count--)
    }
    return tmp
  }

  console.log(uniqueArray(10, 100))
  console.log(uniqueArray(100, 10))

</script>


Часовой пояс GMT +3, время: 05:48.