@DarCKoder

Почему в массиве повторяются числа??

Есть код:
var clientWidth = document.documentElement.clientWidth;
		var columQty = Math.floor(clientWidth / 16);
		var randNumbersArray = [];
		function getRandomNum(min,max){
			return Math.floor(Math.random() * (max - min + 1)) + min;
		}
		var makingColumsInterval = setInterval(function(){
			var randomNum = getRandomNum(1, columQty);

			if(randNumbersArray.length == 0){
				randNumbersArray.push(randomNum);
			} else if(randNumbersArray.length == columQty){
				clearInterval(makingColumsInterval);
			} else{
				for(var i = 0; i <= randNumbersArray.length-1; i++){
					if(randomNum == randNumbersArray[i]){
						i--;
						break;
					} else{
						randNumbersArray.push(randomNum);
						break;
					}
				}
			}
			// clearInterval(makingColumsInterval);
		},100);


Но в массиве не все числа уникальны.
  • Вопрос задан
  • 199 просмотров
Решения вопроса 1
@chak_zefir
Хочу сказать, что код хороший, но немного запутан.
Мне кажется у вас проблема в проверке на равенство текущего и предыдущего чисел:
if(randomNum == randNumbersArray[i])

Например, число шесть, имеет индекс 0 (т.е. первый элемент в массиве). Затем шестёрка опять рандомно генерируется, но уже с индексом 16. И в этом случае, ничего не помешает ей записаться, потому что в индексе 15 наверняка будет совершенно другое число.

Если хотите избежать повторов, необходимо проверять на совпадение все числа в массиве, и лишь после этого добавлять рандомно сгенерированное.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@pestilent
for(var i = 0; i <= randNumbersArray.length-1; i++){
  if(randomNum == randNumbersArray[i]){
    i--;
    break;
  } else{
    randNumbersArray.push(randomNum);
    break;
  }
}

Этот код просто не имеет смысла. Можно исправить, например, так: если найдено совпадение, делаем return из функции, else не нужен, push выносится за цикл.
Ответ написан
Комментировать
@yeti357
Потому что, Math.random() генерит псевдо случайные числа. И гарантированной уникальности этих чисел не даёт. Бросая монетку 2 раза, у вас нет никаких гарантий, что она упадёт и на решку и на орла.
Что бы получить массив уникальных чисел можно воспользоваться Set из es6 или на indexOf проверять
let arr = [1,1,2,3];
Array.from(new Set(arr)); // [1,2,3]
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы