Просмотр полной версии : random() или Math.random(). Проблемка
Вообщем! Допустим есть у меня цикл, нужно чтобы в этом цикле массив заполнился значениями неповторяющимися! Т.е. если в цикле 16итераций, то массив должен заполниться значениями от 0 до 15 случайным образом. Например такой код не работает (там есть повторы)
k = 0;
for (i = 0; i < 16; i++)
arr[i] = Math.floor(Math.random()*16);
Есть способ заполнить массив по-моему?
есть.
1. для понимания разницы между random() и Math.random() есть шот-кат - F1
2. для заполнения последовательности рядом в случайном порядке перебирай порядок и ищи случайные места в последовательности из числа свободных.
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));
Да. рулез )) только мне кажется. стоит Math.floor() заменить на Math.round все-таки.. так точнее ;)
ну.. floor же округляет в меньшую сторону, а round по ходу решает куда округлять. Хотя точно утверждать не могу, что мой вариант точнее твоего. Все относительно.
Ваш метод глупее.
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 < как вам такой массив?
Да-да! Я тоже проверил свой метод.
Спасибо огромное за помощь. Сейчас вот пытаюсь понять почему при округлении до ближайшего целого получаются ошибочные значеня. Хотя теоретически это понятно. Так как 1,9 и 2,1 в случае round() - равны, а в floor() или ceil() повтор исключается.
Что самое интересное - то флеха генерит значения всегда в виде 1,111 или 3,1111 и т.п. и теоретически даже при округлении не должно быть ошибки =\
Math.random возвращает число 0<= x < 1. Если вы умножаете его на 4 то получите 0<= x4 < 4.
Math.floor даст вам одно значение из 0,1,2,3
Math.ceil даст вам одно значение из 1,2,3,4
Элементы массива ведут свой отсчет от 0. Поэтому логично использовать Math.floor.
Аааа, вот теперь понятно! Спасибо огромное еще раз )
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.