Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.03.2019, 03:49
Новичок на форуме
Отправить личное сообщение для Володимир Посмотреть профиль Найти все сообщения от Володимир
 
Регистрация: 20.03.2019
Сообщений: 7

Хочу получить рандомное не повт. число.
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 в 03:51.
Ответить с цитированием
  #2 (permalink)  
Старый 20.03.2019, 07:31
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

Володимир,
создай массив с нужными числами и перемешай
Ответить с цитированием
  #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.
Ответить с цитированием
  #4 (permalink)  
Старый 20.03.2019, 11:34
Новичок на форуме
Отправить личное сообщение для Володимир Посмотреть профиль Найти все сообщения от Володимир
 
Регистрация: 20.03.2019
Сообщений: 7

Через метод contact или как?
И можете мне обьяснить почему второй for не хочет работать???
Очень вас прошу
Ответить с цитированием
  #5 (permalink)  
Старый 20.03.2019, 11:35
Новичок на форуме
Отправить личное сообщение для Володимир Посмотреть профиль Найти все сообщения от Володимир
 
Регистрация: 20.03.2019
Сообщений: 7

Спасибо,вам канешно,но для меня,сложно понять даный код(
Ответить с цитированием
  #6 (permalink)  
Старый 20.03.2019, 16:33
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

Володимир,
<!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>
Ответить с цитированием
  #7 (permalink)  
Старый 20.03.2019, 17:37
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

<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>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите мне с кодом пожалуйста.я хочу что бы когда i = 5 число больше не росло Qwerty556678 Общие вопросы Javascript 2 07.03.2018 16:04
Получить координаты курсора в текстовом поле в пикселях prike Events/DOM/Window 4 23.05.2013 04:35
Не получить число из <td> runny Элементы интерфейса 5 13.04.2013 01:09
node.js рандомное число web_programmist AJAX и COMET 3 07.01.2013 03:44
Как получить максимальное и минимальное допустимое число в не экспоненциальном виде? FINoM Общие вопросы Javascript 17 25.02.2011 14:48