PDA

Просмотр полной версии : random() или Math.random(). Проблемка


DissDoc
27.06.2006, 22:02
Вообщем! Допустим есть у меня цикл, нужно чтобы в этом цикле массив заполнился значениями неповторяющимися! Т.е. если в цикле 16итераций, то массив должен заполниться значениями от 0 до 15 случайным образом. Например такой код не работает (там есть повторы)

k = 0;
for (i = 0; i < 16; i++)
arr[i] = Math.floor(Math.random()*16);

Есть способ заполнить массив по-моему?

Double
27.06.2006, 22:12
есть.
1. для понимания разницы между random() и Math.random() есть шот-кат - F1
2. для заполнения последовательности рядом в случайном порядке перебирай порядок и ищи случайные места в последовательности из числа свободных.

iNils
27.06.2006, 22:18
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));

Double
27.06.2006, 22:30
красиво.

DissDoc
28.06.2006, 14:00
Да. рулез )) только мне кажется. стоит Math.floor() заменить на Math.round все-таки.. так точнее ;)

iNils
28.06.2006, 14:02
Куда точнее?

DissDoc
28.06.2006, 14:09
ну.. floor же округляет в меньшую сторону, а round по ходу решает куда округлять. Хотя точно утверждать не могу, что мой вариант точнее твоего. Все относительно.

iNils
28.06.2006, 14:13
Ваш метод глупее.
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 < как вам такой массив?

DissDoc
28.06.2006, 16:29
Да-да! Я тоже проверил свой метод.
Спасибо огромное за помощь. Сейчас вот пытаюсь понять почему при округлении до ближайшего целого получаются ошибочные значеня. Хотя теоретически это понятно. Так как 1,9 и 2,1 в случае round() - равны, а в floor() или ceil() повтор исключается.

Что самое интересное - то флеха генерит значения всегда в виде 1,111 или 3,1111 и т.п. и теоретически даже при округлении не должно быть ошибки =\

iNils
28.06.2006, 16:46
Math.random возвращает число 0<= x < 1. Если вы умножаете его на 4 то получите 0<= x4 < 4.
Math.floor даст вам одно значение из 0,1,2,3
Math.ceil даст вам одно значение из 1,2,3,4
Элементы массива ведут свой отсчет от 0. Поэтому логично использовать Math.floor.

DissDoc
28.06.2006, 16:58
Аааа, вот теперь понятно! Спасибо огромное еще раз )