Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.05.2015, 22:31
Профессор
Отправить личное сообщение для Blondinka Посмотреть профиль Найти все сообщения от Blondinka
 
Регистрация: 21.03.2014
Сообщений: 173

Генерирование массива с уникальными элементами.
Здравствуйте.
Пытаюсь вывести в цикле массив из 100 уникальных элементов.
Следующий код работает, но элементы повторяются (не уникальны).
var numbers = [];
for(var i = 0; i < 100; i++){
    var newItem = Math.floor(Math.random()*101);
    numbers.push(newItem);
}

document.write(numbers);


Этот не выводит ничего.
var numbers = [];
for(var i = 0; i < 100; i++){
    var newItem = Math.floor(Math.random()*101);
	if(numbers.length < 2){numbers.push(newItem);//Мало вероятно, что первые 2 элемента будут равны.
	}else{
        for(var j = 0; j < numbers.length; j++){
            if(newItem != numbers[j])numbers.push(newItem);
	}
    }
numbers.push(newItem);
}

document.write(numbers);

Подскажите, пожалуйста, почему второй код не работает. Где ошибка?
Ответить с цитированием
  #2 (permalink)  
Старый 10.05.2015, 23:05
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

Blondinka,
массив заполняется в вашем случае по порядку без всякого random -- когда массив заполнен его перемешивают

Сообщение от Blondinka
Этот не выводит ничего.
строка 6
Сообщение от Blondinka
j < numbers.length
это условие бесконечного цикла
Ответить с цитированием
  #3 (permalink)  
Старый 10.05.2015, 23:41
Аватар для Leon-on12
Аспирант
Отправить личное сообщение для Leon-on12 Посмотреть профиль Найти все сообщения от Leon-on12
 
Регистрация: 07.04.2015
Сообщений: 65

Предлагаю довольно странную проверку нового элемента на соответствие с уже записанными.
Ваше решение видимо короче, и менее грузно для процессора. Но разобраться в нём я не смог.
var numbers = [];
numbers[0] = Math.floor(Math.random()*101);
var check;
for(var i = 0; i < 100; i++){
	var newItem = Math.floor(Math.random()*101);
	check = 0;
	for(var n = 0; n < numbers.length; n++){
		if (newItem == numbers[n]){
			check++;
		}
	}
	if (check == 0){
		numbers.push(newItem);
	}
}

document.write(numbers);

Но возникает проблема в том что элементов не 100. У меня получилось в среднем 65 элементов. Если у нас просто 100 элементов надо расположить в произвольном порядке, то это задача чуть чуть другая, и решать её стоит чуть чуть по другому.
В смысле что у Вас 100 элементов и рандом даёт вам число от 100 до 1.
То есть у вас есть дискретный набор элементов которые надо перемешать.

Уточните пожалуйста задачу, в виду того что накручивать ещё костылей на моё решение для получения именно 100 элементов бессмысленно.
Поставьте перед собой правильную задачу.
Ответить с цитированием
  #4 (permalink)  
Старый 11.05.2015, 00:09
Профессор
Отправить личное сообщение для Blondinka Посмотреть профиль Найти все сообщения от Blondinka
 
Регистрация: 21.03.2014
Сообщений: 173

Leon-on12,
Сообщение от Leon-on12 Посмотреть сообщение
Уточните пожалуйста задачу, в виду того что накручивать ещё костылей на моё решение для получения именно 100 элементов бессмысленно.
Массив из n элементов расположить в случайном порядке, но чтоб элементы не дублировались.
Ответить с цитированием
  #5 (permalink)  
Старый 11.05.2015, 00:24
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Blondinka
document.write();
document.cookDinner();
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #6 (permalink)  
Старый 11.05.2015, 00:30
Профессор
Отправить личное сообщение для Blondinka Посмотреть профиль Найти все сообщения от Blondinka
 
Регистрация: 21.03.2014
Сообщений: 173

nerv_, document.write() - это плохо?
Ответить с цитированием
  #7 (permalink)  
Старый 11.05.2015, 10:34
Аватар для Leon-on12
Аспирант
Отправить личное сообщение для Leon-on12 Посмотреть профиль Найти все сообщения от Leon-on12
 
Регистрация: 07.04.2015
Сообщений: 65

Для начала мы создаём массив.
var numbers = [];
for (var i=0; i < 100; i++){
	numbers[i] = (i+1);
}

Дальше мы последовательно берём каждый элемент, придумываем ему новое место, с помощью вашего генератора случайных чисел, и меняем его местами с элементом который стоит на новом месте.
var number1;
var number2;
var position;
for (var n=0; n<100; n++){
	number1 = numbers[n];
	position = Math.floor(Math.random()*100);
	number2 = numbers[position];
	numbers[position] = number1;
	numbers[n] = number2;
}

Это наглядный вариант. Его можно сократить убрав одну строчку и одну переменную.
Объединив код, сократив его, написав Ваше document.cookDinner(); И учитя что Вы любите объявлять переменные в коде, получаем:
var numbers = [];
for (var i=0; i < 100; i++){
	numbers[i] = (i+1);
}
for (var n=0; n<100; n++){
	var number1 = numbers[n];
	var position = Math.floor(Math.random()*100);
	numbers[n] = numbers[position];
	numbers[position] = number1;
}

document.write(numbers);

Так же Вы не уточнили какие именно элементы вам нужны. Так как в вашем примере генератор давал числа от 0 до 100, а это 101 элемент.
Ответить с цитированием
  #8 (permalink)  
Старый 11.05.2015, 11:19
Аватар для JsConAp
Интересующийся
Отправить личное сообщение для JsConAp Посмотреть профиль Найти все сообщения от JsConAp
 
Регистрация: 22.02.2015
Сообщений: 24

Blondinka,
function getRandArr(arr, range) {
    var tmp = {};
    for (var i = 0; i < range; i++) {
        arr.push(Math.floor(Math.random() * (range + 1)));
    }

    for (var i = 0; i < arr.length; i++) {
        tmp[arr[i] + '.'] = 1;
    }
    if (Object.keys(tmp).length !== range) {
        for (var i = 0; i < arr.length; i++) {
            var newItem = Math.floor(Math.random() * (range + 1));
            tmp[(arr[i] + newItem) + '.'] = 1
        }
    }

    arr = Object.keys(tmp), count = arr.length;
    while (count > range) {
        count--;
        arr.splice(count, 1);
    }

    arr = arr.join('').split('.');
    arr.pop();
    return arr;
}
alert(getRandArr([], 100));
Ответить с цитированием
  #9 (permalink)  
Старый 11.05.2015, 12:38
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

на всякий случай
функция формирования массива с уникальными данными с заданной длиной и диапазоном
Ответить с цитированием
  #10 (permalink)  
Старый 11.05.2015, 15:43
Профессор
Отправить личное сообщение для Blondinka Посмотреть профиль Найти все сообщения от Blondinka
 
Регистрация: 21.03.2014
Сообщений: 173

Спасибо.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сделать все элементы массива уникальными exec Общие вопросы Javascript 43 25.12.2015 01:14
Сортировка массива по возрастанию другого массива. vas88811 Events/DOM/Window 4 12.01.2014 10:31
Замена элементов массива элементами массива prostoix Javascript под браузер 4 24.10.2013 17:36
Анимация массива с элементами, и вызов функции по завершению. Broken jQuery 5 30.08.2012 20:35
проблема с элементами массива Krinart Общие вопросы Javascript 3 05.09.2008 21:06