28.05.2010, 17:27
|
Профессор
|
|
Регистрация: 21.01.2010
Сообщений: 1,022
|
|
Сделать все элементы массива уникальными
Есть массив с 10 элементами, содержащими числа от 0 до 20. Надо сделать так, чтобы не было одинаковых элементов, чтобы они заменились на любое другое число (от 0 до 20). Ума не приложу, как это сделать.
Готовый код не нужен, просто подкиньте алгоритм, как это всё организовать.
|
|
28.05.2010, 17:40
|
|
Профессор
|
|
Регистрация: 10.09.2009
Сообщений: 1,577
|
|
Код:
|
WhoIs = {}
цикл по элементам
if (WhoIs[текущее значение]) меняем на уникальное и обновляем WhoIs.
WhoIs[текущее значение] = 'занято';
end цикл по элементам |
меняем на уникальное - с помощью отдельной функции - она его найдет учитывая WhoIs
|
|
29.05.2010, 14:20
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,120
|
|
а если сразу формировать массив с уникальными элементами ? чтоб его потом не проверять на повторы
|
|
29.05.2010, 14:43
|
Профессор
|
|
Регистрация: 21.01.2010
Сообщений: 1,022
|
|
рони, тогда массив станет меньше. А если добавить в него рандомное число, оно может совпасть с каким-нибудь оставшимся в массиве числом.
micscr, а причём тут хэш?
|
|
29.05.2010, 14:46
|
|
Профессор
|
|
Регистрация: 10.09.2009
Сообщений: 1,577
|
|
Сообщение от exec
|
micscr, а причём тут хэш?
|
что за хэш ?
|
|
29.05.2010, 14:52
|
Профессор
|
|
Регистрация: 21.01.2010
Сообщений: 1,022
|
|
|
|
29.05.2010, 14:54
|
Профессор
|
|
Регистрация: 21.01.2010
Сообщений: 1,022
|
|
-------------
Есть вариант — напустить на массив array_unique, потом, пока массив не примет прежний размер, добавлять в него рандомные числа, предварительно проверяя, не нахоятся ли они уже внутри него. Но порядок чисел должен сохраняться, поэтому это не подходит.
|
|
29.05.2010, 15:10
|
|
Профессор
|
|
Регистрация: 10.09.2009
Сообщений: 1,577
|
|
Сообщение от exec
|
Вот.
|
это вспомогательный объект - в его свойствах будут содержаться уже присутствующие элементы.
|
|
29.05.2010, 15:23
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,120
|
|
функция формирования массива с уникальными данными с заданной длиной и диапазоном
<script language="JavaScript" type="text/javascript">
function random(min,max,l)
{var arr = [],m = [],n = 0;
if (max - min < l-1) return;
for (var i=0; i<=(max-min); i++)m[i] = i + min;
for (var i=0; i<l; i++) {n = Math.floor(Math.random()*(m.length)); arr[i]=m.splice(n,1)[0];};
return arr
}
document.write(JSON.stringify(random(0,20,10)))
</script>
Последний раз редактировалось рони, 12.04.2015 в 13:03.
|
|
29.05.2010, 15:24
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,120
|
|
вариант отлова на скорую руку
<script language="JavaScript" type="text/javascript">
function usefloor(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}
var m = [],
s = [],
t = [];
var l = 10; //длина массива
var min = 0;
var max = 20;
//создание массива m с неуникальными элементами
for (var i = 0; i < l; i++) {
m[i] = usefloor(min, max)
}
var test="<br>" + m;
//создание массива t из оставшихся элементов на случай замены
for (var i = 0; i <= (max - min); i++) {
s[i] = 1;
}
for (var i = 0; i < l; i++) {
s[m[i]] = 0;
}
for (var i = 0; i < s.length; i++) {
if (s[i] == 1) t.push(i)
}
test+="<br>" + t;
//проверка m на уникальность и замена повторяющихся элементов
for (var i = 0; i < l; i++) {
for (var k = i + 1; k < l; k++) {
if (m[k] == m[i]) {
n = usefloor(0, (t.length - 1));
m[k] = "<font color='#FF0000'>" + t[n] + "</font>";
t.splice(n, 1);
}
}
}
document.write(test+"<br>" + m);
</script>
Последний раз редактировалось рони, 16.06.2010 в 05:59.
|
|
|
|