Xeroxed
@Xeroxed
Senior javascript developer

Почему алгоритм работает некорректно?

Здравия.
Ума не приложу, почему не работает корректно алгоритм.

var arr, max_number, i, unic;
arr = [];
max_number = 42;
while (arr.length < 42) {
  do {
    unic = true;
    a = Math.floor(Math.random() * 42);
    for (i = 0; i < arr.length; i++) {
      if (a == arr[i]) {
        unic = false;
        break;
      }
    }
  } while (!unic) { 
     a = Math.floor(Math.random() * 42);
  }
  arr.push(a);
}


Задача заполнить массив случайными уникальными числами. В итоге массив "arr" заполняется местами одинаковыми числами. Заранее благодарю за попытку предложить варианты перемешивания массива, но увы: вопрос обставлен иначе.
  • Вопрос задан
  • 216 просмотров
Решения вопроса 2
Petroveg
@Petroveg
Миром правят маленькие с#@&ки
Про неверный синтаксис do while уже написали.
Я бы делал примерно так

var x = set(42);

console.log(x);

function set (max_number) {
	var array = [];

	set.unic = [];

	while (array.length < max_number) {
		array.push(get());
	}

	delete set.unic;
	return array;

	function get (a) {
		do {
			a = Math.floor(Math.random() * max_number);
		} while (isFinite(set.unic[a]));

		return a;
	}
}
Ответ написан
Комментировать
index0h
@index0h
PHP, Golang. https://github.com/index0h
Ужос. Где var перед переменной a? Зачем вам явный тройной цикл, есть же indexOf

var data = [],
    count = 42,
    tmpVar;
while (data.length < count) {
    tmpVar = Math.floor(Math.random() * count);
    if (data.indexOf(tmpVar) === -1) {
        data.push(tmpVar);
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@serega_kaktus
Программист-самоучка, фрилансер
var arr, max_number, i, unic;
arr = [];
max_number = 42;
while (arr.length < 42) {
  do {
    unic = true;
    a = Math.floor(Math.random() * 42);
    for (i = 0; i < arr.length; i++) {
      if (a == arr[i]) {
        unic = false;
        break;
      }
    }
  } while (!unic);
  arr.push(a);
}

Вы сначала находили в цикле do уникальное значение, а потом присвоили переменной a новое значение после цикла.
Ответ написан
Комментировать
@Kano
Не могу понять от куда у вас могла взяться приписка после второго while
{ 
     a = Math.floor(Math.random() * 42);
  }

Уберите этот код и объявите переменную в начале кода через var a; а то судя по коду вы используете глобально определенную переменную "а" или же объявляете её глобально, а это не очень правильный подход
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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