Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 06.01.2007, 20:44
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 11  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Слегка переписал код чтобы было понятнее.
Код:
//// первоначальный массив
var arrayA:Array = new Array (0, 1, 2, 3, 4, 5, 6);
//// это функция которая делает массив случайным, ее не трогаем
function getNewRandom (arrayA:Array):Array {
	var arrayB:Array = arrayA.concat ();
	var arrayC:Array = new Array ();
	for (var i:Number = 0; i < arrayA.length; i++) {
		var rnd:Number = Math.floor (Math.random () * arrayB.length);
		arrayC.push (arrayB.splice (rnd, 1));
	}
	return arrayC;
}
//// создаем случайный массив номер 1
var arrayR1:Array = getNewRandom (arrayA);
//// создаем случайный массив номер 2
var arrayR2:Array = getNewRandom (arrayA);
//// создаем случайный массив номер 3
var arrayR3:Array = getNewRandom (arrayA);
//// это просто в качестве примера выводим содержимое этих массивов
trace (arrayR1);
trace (arrayR2);
trace (arrayR3);
Если вам нужен только один случайный массив, то вы используйте только один getNewRandom. А на выходе получите массив в котором все значение случайно перемешаны в отличии от исходного. Вы проходитесь по всем элементам полученного массива и делаете с их значением что вам там угодно.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 06.01.2007, 20:56
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 12  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Я использую другой вариант. Принцип где-то похож, но чуть меньше кода
Код:
var _arr:Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
function orderRND():Number{
return Math.floor(Math.random()*2-1);
}
_arr.sort(orderRND);
Математику можно немножко более точной сделать, но в принципе и так работает.
__________________
Hell is the possibility of sanity

Старый 06.01.2007, 20:58
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 13  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Цитата:
Сообщение от wvxvw
Я использую другой вариант. Принцип где-то похож, но чуть меньше кода
Код:
var _arr:Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
function orderRND():Number{
return Math.floor(Math.random()*2-1);
}
_arr.sort(orderRND);
Математику можно немножко более точной сделать, но в принципе и так работает.
И что это? Какой был массив, таким и остался.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 06.01.2007, 21:01
poorjorik вне форума Посмотреть профиль Отправить личное сообщение для poorjorik Найти все сообщения от poorjorik
  № 14  
Ответить с цитированием
poorjorik
 
Аватар для poorjorik

Регистрация: Oct 2002
Адрес: Москов сити.
Сообщений: 48
Выдает такие ошибки:
Symbol=ðàìêà, Layer=Layer 1, Frame=1: Line 4: '{' expected
function getNewRandom (arrayA:Array):Array {

Symbol=ðàìêà, Layer=Layer 1, Frame=1: Line 12: Unexpected '}' encountered
}

Старый 06.01.2007, 21:03
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 15  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Код:
var _arr:Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
function orderRND():Number{
return Math.floor(Math.random()*2.5-1);
}
_arr.sort(orderRND);
В код вкралась досадная очепятка, не 2. а 2.5 %)

ЗЫ. У этого метода есть определенные недостатки - первый член массива практически всегда остается на первой позиции. Но с другой стороны - операцию нужно делать всего 1 раз, а не каждый раз, когда нужно получить случайный элемент массива.

ЗЫ. 2.9999999 будет еще лучше, чем 2.5

ЗЫЫ. ДА, и еще недостаток... такой рандом получается хуже родного флешевского рандома (даже если операцию повторить несколько раз, то значения распространяются недостаточно равномерно.... но если "качество" не принципиально (просто прокрутить серию клипов, например) то и так сойдет, а если нужно "настоящее" рандомальное число, ну или по крайней мере "более" рандомальное (например имитация подбрасывания костей) то лучше так не делать =)
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 06.01.2007 в 21:23.
Старый 06.01.2007, 21:28
poorjorik вне форума Посмотреть профиль Отправить личное сообщение для poorjorik Найти все сообщения от poorjorik
  № 16  
Ответить с цитированием
poorjorik
 
Аватар для poorjorik

Регистрация: Oct 2002
Адрес: Москов сити.
Сообщений: 48
Складывается ощущение неприятное что я остаюсь в стороне от общего разговора.
Посмотрите исходник пожалуйста. рандом генератор случайных уникальных чисел у меня есть, я приводил его код в первом посте. Но он корректно не работет в моем случае. Вообще вопрос не в том как рандом сделать, а как в моем случае заставить корректно его работать.

Старый 07.01.2007, 00:06
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 17  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Посмотрел исходник.... А есть какая-то реальная необходимость делать это в АС1? Если честно, просто элементарно не нашел место, где находится этот скрипт, который не работает. Просто дико неудобно.

Вариант iNils'a предлагает функцию, которая будет при каждом запуске выдавать один член массива с произвольным индексом и удалять его, после того, как в массиве не останется ничего функция закончит работу.

В моем варианте функция просто сортирует массив в произвольном порядке. Т.е. запустив ее 1 раз получим из массива 1,2,3,4,5,6,7,8,9,0 например 2,4,1,6,3,7,0,8,9,5.

Ваше дело, как это применять.
__________________
Hell is the possibility of sanity

Старый 09.01.2007, 15:38
Kikasso вне форума Посмотреть профиль Отправить личное сообщение для Kikasso Найти все сообщения от Kikasso
  № 18  
Ответить с цитированием
Kikasso
 
Аватар для Kikasso

Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
Цитата:
Сообщение от iNils
Код:
var arrayA:Array = new Array (0, 1, 2, 3, 4, 5, 6);
var arrayB:Array = arrayA.concat()
for (var i:Number = 0; i < arrayA.length; i++) {
	var rnd:Number = Math.floor (Math.random () * arrayB.length);
	var del:Array = arrayB.splice (rnd, 1);
	trace (arrayA[del]);
}
Уважаемый iNils, извините пож. но почему этот код выводит то что хотелось и компилятор не ругается?
Если del это Array, то что такое arrayA[del]?

Я бы так сделал:
Код:
//исходный массив
var myArr:Array = new Array (0, 1, 2, 3, 4, 5, 6);
// копия 
var arr:Array = myArr.concat();
//длинна массива, чтобы не искать ее лишний раз
var num:Number = arr.length;
while ( num > 0 ){
	// случайный индекс
	var rnd:Number = Math.floor (Math.random () * num );
	// выдергиваем элемент с этим индексом из массива
	trace (arr.splice( rnd, 1 ) );
	// длинна массива уменьшилась
	num--;
}
PS - только что заметил вторую страницу. Вопрос все равно остался.
Автор, а повторения кстати неизбежны.
Имеем ряд 1,2,3
Первое перемешивание 2,3,1
Второе перемешивание 1,3,2
цифра 1 повторилась - все как в жизни, так бывает.
Если вам нужно избежать такой ситуации, надо исключать последний выпавший номер из нашей "лотереи".


Последний раз редактировалось Kikasso; 09.01.2007 в 16:04.
Старый 09.01.2007, 16:15
Kikasso вне форума Посмотреть профиль Отправить личное сообщение для Kikasso Найти все сообщения от Kikasso
  № 19  
Ответить с цитированием
Kikasso
 
Аватар для Kikasso

Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
Ошибка выделена:
Код:
var playscene=[1,2,3,4,5,6,7,8,9];
n=Math.floor(Math.random()*playscene.length); //или n=random(playscene.length), если очень хочется
this.gotoAndStop(playscene[n]);
playscene.splice(n,1);
Только код надо вынести из того клипа, который вы дублируете, потому что массив у вас создается каждый раз заново.


Последний раз редактировалось Kikasso; 09.01.2007 в 16:34.
Создать новую тему Ответ Часовой пояс GMT +4, время: 14:59.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 14:59.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.