Просмотр полной версии : Math.random() , вытяжка из массива и подгрузка обратно
var arr = [1,2,3,4,5,6]
tf_text = arr[Math.floor(Math.random()*arr.length)]
Выбираем некий случайны элемент, затем надо повторять эту функцию = кол элементов в массиве, но при этом выбирать каждый раз новый, тоесть те ктороые были выбраны должны отсеятся
как такое организовывается:?
П.с. вот моя методика, но почему то иногда удаляется не тот элемент, тоесть предидущий остается. В чем может быть ошибка?
var a = Math.floor(Math.random() * (arr.length - 2));
arr.splice(a,1);
arr1.splice(a,1);
arr2.splice(a,1);
a = Math.floor(Math.random() * (arr.length - 1));
tf33.text = arr[a];
trace(arr);
if (tf_answer.text.toString() == arr2[a]) {
SUPER_COUNT++;
}
После выбора случайного элемента просто удаляй его из массива и всё. Именно удаляй, а не обнуляй или не делай неопределенным:
http://www.flasher.ru/forum/showthread.php?t=138239
чтобы размер массива стал меньше на единицу.
При желании первоначальный массив можно сохранить, а для операций всех этих использовать его копию.
Мункар я ответил уже, таким же алгоритмом. Тока толку мало в нем
var array:Array = [ 1, 2, 3, 4, 5, 6 ];
var clone:Array = [].concat(array);
var l:Number = array.length;
for (var i:Number = 0; i < l; i++)
{
trace(getRandomElement());
}
function getRandomElement():Object
{
return clone.splice(Math.floor(Math.random() * clone.length), 1)[0];
}
Вероятно "толку нет" не в алгоритме, а в реализации.
Прекрасный алгоритм:
var arr:Array = [1,2,3,4,5,6];
this.onEnterFrame = function () {
trace('Длина массива = ' + arr.length);
if (arr.length != 0)
{
var randomIndex:Number = Math.floor(Math.random() * arr.length);
var randomElement = arr[randomIndex];
trace('randomIndex = ' + randomIndex);
trace('randomElement = ' + randomElement);
trace('-------------------------');
arr.splice(randomIndex, 1);
}
else
{
delete this.onEnterFrame ;
trace('-------------------------');
trace('Конец массива');
}
};
Скопируй и запусти.
Та это все понятно, задача немного сложнее, чем я расписал просто. Видимо косяки в другом. Задача такая :
есть 2 массива данных из XML. Допустим title атрибутов и url атрибутов.
Автоматом перейдя на кадр, запускается рандом. выбирающий некий элемент из массива 1. А далее, при нажатии на кнопку идет проверка, если текст в поле соотв тексту массива 2, то в память кидаем +1 для некой переменной. Затем этот элемент удаляется, остается новый массив 1 , соответсвующий массиву 2, и снова опреция повторяется, до тех пор пока массив не будет разрушен. Вот такая не получается бойда, почему то массивы то расходятся, то их значения спешат на 1 и т.д....
Добавлено через 5 минут
На данный момент это безобразие ( кусок только) выглядет так,
if (_global.ORDER != "Random") {
defaulT();
}
else {
defaulT1();
}
function defaulT() {
tf33.text = arr[0];
}
btn.onRelease = somefunction;
somefunction() {
if (a == true && b == false) {
var ab = Math.floor(Math.random() * (arr.length - 1));
if (arr.length >= 1 && arr.length < _global.MAX - 1) {
tf33.text = arr[ab];
if (tf_answer.text.toString() == arr2[ab]) {
SUPER_COUNT++;
}
}
else {
tf33.text = arr[0];
if (tf_answer.text.toString() == arr2[0]) {
ab = 0;
SUPER_COUNT++;
}
}
trace(arr);
trace(arr2);
//trace(SUPER_COUNT);
arr.splice(ab,1);
arr1.splice(ab,1);
arr2.splice(ab,1);
//trace(arr);
}
}
где MAX = начальной длинне массива
Ошибки в определении диапазона выборки? (arr.length - 2 зачем? )
где минус 2 ? Нету там такого
Почему тогда первоначальный диапазон равен arr.length - 1 ?
Добавлено через 6 минут
Чтобы получить случайный индекс, нужно использовать Math.floor(Math.random() * arr.length)
ты думаешь в этом косяк? Что то я очень сомневаюсь. Хотя проверу
Просто если нужно выбрать случайное число из диапазона 0 - 10, то мы запишем так:
var rand:Number = Math.floor(Math.random() * (10 + 1));
То есть надо будет увеличить диапазон на 1, поскольку берем Math.floor, который округяет в меньшую сторону, и если 1 не добавить, то последнее значение никогда не выпадет.
А тут массив, и номера индексов идут с нуля, но количество элементов (то есть длина массива) уже больше на единицу по отношению к нумерации индексов, поэтому нет смысла писать
Math.floor(Math.random() * (arr.length + 1 - 1));
а можно сразу
Math.floor(Math.random() * arr.length)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.