![]() |
|
||||||||||
|
|||||
|
Banned
[+4 01.02.09]
[+1 01.02.09] |
Что-то какой-то вывих мозга под конец рабочего дня
![]() arrY0=[]
for (var i=0; i<4; i++) {
arrY0[i]=i
trace(typeof(arrY0[i])+" "+arrY0[i]+" arrY0")
}
arrYk=[]
for (var i=0; i<4; i++) {
id=Math.round(Math.random()*(arrY0.length-1))
trace("id "+id+" "+typeof(arrY0[id])+" "+arrY0[id])
arrYk.push(arrY0.splice(id, 1))
trace(typeof(arrYk[i])+" "+arrYk[i]+" push "+arrYk.length)
}
number 0 arrY0 number 1 arrY0 number 2 arrY0 number 3 arrY0 id 0 number 0 object 0 push 1 id 0 number 1 object 1 push 2 id 1 number 3 object 3 push 3 id 0 number 2 object 2 push 4 Как так? Берет из массива число, записывает (push) в другой массив, читает его как число, но это НЕ ЧИСЛО, а объект? |
|
|||||
|
Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
|
Все правильно. В массиве может быть что угодно. Надо кастить, если надо.
|
|
|||||
|
Banned
[+4 01.02.09]
[+1 01.02.09] |
Все разобрался таки
![]() Как обычно все просто arrY0=[]
for (var i=0; i<4; i++) {
arrY0[i]=i
trace(typeof(arrY0[i])+" "+arrY0[i]+" arrY0")
}
arrYk=[]
for (var i=0; i<4; i++) {
id=Math.round(Math.random()*(arrY0.length-1))
trace("id "+id+" "+typeof(arrY0[id])+" "+arrY0[id])
arrYk.push(arrY0.splice(id, 1)[0])
trace(typeof(arrYk[i])+" "+arrYk[i]+" push "+arrYk.length)
}
было arrYk.push(arrY0.splice(id, 1)) стало arrYk.push(arrY0.splice(id, 1)[0]) т.е. splice возращает массив все-таки, хотя бы состоящий и из одного элемента, а это уже объект. Теперь все нормуль: number 0 arrY0 number 1 arrY0 number 2 arrY0 number 3 arrY0 id 1 number 1 number 1 push 1 id 2 number 3 number 3 push 2 id 0 number 0 number 0 push 3 id 0 number 2 number 2 push 4 |
|
|||||
|
Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
|
А, точно. Просто в классах компиллятор ругается, если не кастить. Ну он-то не знает, что в массиве, а плеер уже знает.
А почему просто не написать слайсы тут какие-то.. Последний раз редактировалось Kikasso; 27.06.2007 в 21:00. |
|
|||||
|
Banned
[+4 01.02.09]
[+1 01.02.09] |
Цитата:
см. параметр id, родительский массив постепенно удаляется. |
|
|||||
|
Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
|
А, точно, там splice.
Чей код, не знаю. Не совсем точно. Последний раз редактировалось Kikasso; 27.06.2007 в 21:08. |
|
|||||
|
Banned
[+4 01.02.09]
[+1 01.02.09] |
Изящное решение!
Но основано скорее на глюке, кстати вот интересно проследить параметр n запуская несколько раз код arr = [1,2,3,4,5,6,7,8,9];
n=0
function f(){
n++
return random(2);
}
arr.sort(f);
trace(arr+" "+n);
век живи - век учись! |
|
|||||
|
Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
|
У вас не совсем надежно - лучше не round() делать, а floor().
Вот навалял - надежно, не совсем правда рационально. var arr:Array = [];
var n = 100;
while (n--) arr.push(n);
var t = getTimer();
var iArr:Array = [];
for (var i = 0; i< arr.length; i++ ) iArr.push( { r:Math.random(), n:i });
function f(a,b):Number{return (a.r - b.r);}
iArr.sort(f);
var out:Array = [];
while( iArr.length ) out.push( arr[ iArr.pop().n ]);
trace(out);
trace( 'ms: ' + (getTimer() - t )); //5ms
Оказалось, вот этот наваляный вариант втрое быстрее, чем тот который я использовал )) splice() все-таки медленно работает. Сравните: var myArr:Array = [];
var n = 100;
while (n--) myArr.push(n);
var t = getTimer();
// копия
var arr:Array = myArr.concat();
var out:Array = [];
var num:Number = arr.length;
while ( num > 0 ){
// случайный индекс
var rnd:Number = Math.floor (Math.random () * num );
// выдергиваем элемент с этим индексом из массива
out.push(arr.splice( rnd, 1 )[0] );
// длинна массива уменьшилась
num--;
}
trace(out);
trace( 'ms: ' + (getTimer() - t ));//14 ms
Последний раз редактировалось Kikasso; 27.06.2007 в 21:49. |
![]() |
![]() |
Часовой пояс GMT +4, время: 12:11. |
|
|
« Предыдущая тема | Следующая тема » |
|
|