Генерирование массива с уникальными элементами.
Здравствуйте.
Пытаюсь вывести в цикле массив из 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);
Подскажите, пожалуйста, почему второй код не работает. Где ошибка? |
Blondinka,
массив заполняется в вашем случае по порядку без всякого random -- когда массив заполнен его перемешивают Цитата:
Цитата:
|
Предлагаю довольно странную проверку нового элемента на соответствие с уже записанными.
Ваше решение видимо короче, и менее грузно для процессора. Но разобраться в нём я не смог.
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 элементов бессмысленно. Поставьте перед собой правильную задачу. ;) |
Leon-on12,
Цитата:
|
Цитата:
document.cookDinner(); |
nerv_, document.write() - это плохо?
|
Для начала мы создаём массив.
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 элемент. |
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));
|
:write: на всякий случай
функция формирования массива с уникальными данными с заданной длиной и диапазоном |
Спасибо.
|
| Часовой пояс GMT +3, время: 01:05. |