![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Oct 2005
Сообщений: 80
|
Вообщем! Допустим есть у меня цикл, нужно чтобы в этом цикле массив заполнился значениями неповторяющимися! Т.е. если в цикле 16итераций, то массив должен заполниться значениями от 0 до 15 случайным образом. Например такой код не работает (там есть повторы)
Есть способ заполнить массив по-моему? |
|
|||||
|
Регистрация: Mar 2001
Сообщений: 1,147
|
есть.
1. для понимания разницы между random() и Math.random() есть шот-кат - F1 2. для заполнения последовательности рядом в случайном порядке перебирай порядок и ищи случайные места в последовательности из числа свободных.
__________________
Кто говорит, тот не знает. Кто знает, тот не говорит. |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
|
function randomOne (len) {
var arrayNumberInit = [];
var arrayNumber = [];
var i;
for (i = 0; i < len; i++) {
arrayNumberInit[i] = i;
}
for (i = 0; i < len; i++) {
arrayNumber[i] = arrayNumberInit.splice (Math.floor (Math.random () * arrayNumberInit.length), 1);
}
return arrayNumber;
}
trace (randomOne (4));
Последний раз редактировалось iNils; 27.06.2006 в 22:22. |
|
|||||
|
Регистрация: Mar 2001
Сообщений: 1,147
|
красиво.
__________________
Кто говорит, тот не знает. Кто знает, тот не говорит. |
|
|||||
|
Регистрация: Oct 2005
Сообщений: 80
|
Да. рулез )) только мне кажется. стоит Math.floor() заменить на Math.round все-таки.. так точнее
![]() |
|
|||||
|
Регистрация: Oct 2005
Сообщений: 80
|
ну.. floor же округляет в меньшую сторону, а round по ходу решает куда округлять. Хотя точно утверждать не могу, что мой вариант точнее твоего. Все относительно.
|
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
|
Ваш метод глупее.
function randomOne (len) {
var arrayNumberInit = [];
var arrayNumber = [];
var i;
for (i = 0; i < len; i++) {
arrayNumberInit[i] = i;
}
for (i = 0; i < len; i++) {
var t= Math.round (Math.random () * arrayNumberInit.length)
trace (t)
arrayNumber[i] = arrayNumberInit.splice (t, 1);
}
return arrayNumber;
}
trace (randomOne (4));
2 3 1 0 2,,1,0 < как вам такой массив? |
|
|||||
|
Регистрация: Oct 2005
Сообщений: 80
|
Да-да! Я тоже проверил свой метод.
Спасибо огромное за помощь. Сейчас вот пытаюсь понять почему при округлении до ближайшего целого получаются ошибочные значеня. Хотя теоретически это понятно. Так как 1,9 и 2,1 в случае round() - равны, а в floor() или ceil() повтор исключается. Что самое интересное - то флеха генерит значения всегда в виде 1,111 или 3,1111 и т.п. и теоретически даже при округлении не должно быть ошибки =\ |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
|
Math.random возвращает число 0<= x < 1. Если вы умножаете его на 4 то получите 0<= x4 < 4.
Math.floor даст вам одно значение из 0,1,2,3 Math.ceil даст вам одно значение из 1,2,3,4 Элементы массива ведут свой отсчет от 0. Поэтому логично использовать Math.floor. |
![]() |
![]() |
Часовой пояс GMT +4, время: 14:00. |
|
|
« Предыдущая тема | Следующая тема » |
|
|