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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 31.05.2009, 20:58
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 1  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
По умолчанию алгоритмы перемешивания какого-либо набора (например колода карт)

Собственно интересны разные варианты и их оптимальность.

Например есть колода карт, нужно ее перемешать, или есть некоторое количество вопросов в нужно выводить их в случайном порядке... и т.д.

Я понимаю, что можно постоянно генерировать случайное число из заданного диапазона и сравнивать с уже полученными ранее, если оно уникально - вычисляем следующее.

Но скорее всего уже есть более оптимальные алгоритмы, может кто сталкивался?
Поделитесь линками или общим принципом, плиз.
__________________
trace("Остановите Землю, я сойду!!!");

Старый 31.05.2009, 21:05
VVall вне форума Посмотреть профиль Отправить личное сообщение для VVall Найти все сообщения от VVall
  № 2  
Ответить с цитированием
VVall

Регистрация: Feb 2009
Сообщений: 1,195
Заводим массив, заполняем индексами в нормальном порядке. В цикле меняем пары случайно выбранных индексов нужное количество раз.

Старый 31.05.2009, 21:58
Яски вне форума Посмотреть профиль Отправить личное сообщение для Яски Найти все сообщения от Яски
  № 3  
Ответить с цитированием
Яски

блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
Код AS3:
{
var array:Array = ["девятка", "десятка", "валет", "дама", "король", "туз"];
array.sort(random)
}
function random (a:*, b:*):int {
   return (Math.random() - 0.5)*100;
}
Или еще лучше
Код AS3:
{
var array:Array = ["девятка", "десятка", "валет", "дама", "король", "туз"];
var shuffed:Array = new Array();
var val:*;
while ((val = array.slice(int(Math.random()*(array.length - 1))), 1) != null) {
   shuffed.push(val);
}
}
__________________
TankiOnline
Я разработчик Alternativa3D


Последний раз редактировалось Яски; 31.05.2009 в 22:05.
Старый 01.06.2009, 00:27
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 4  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
Всем спасибо

Код AS3:
private function randomizeArray(array:Array):Array
{
	var randomizedArray:Array = new Array();
 
	while (array.length)
	{
		randomizedArray.push(array.splice(Math.floor(Math.random() * array.length), 1)[0]);
	}
 
	return randomizedArray;
}
__________________
trace("Остановите Землю, я сойду!!!");

Старый 01.06.2009, 10:30
Smrad вне форума Посмотреть профиль Отправить личное сообщение для Smrad Найти все сообщения от Smrad
  № 5  
Ответить с цитированием
Smrad

Регистрация: Nov 2008
Сообщений: 205
Отправить сообщение для Smrad с помощью ICQ
О(n^2)

Старый 01.06.2009, 12:47
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 6  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
Цитата:
Сообщение от Smrad Посмотреть сообщение
О(n^2)
Это как понимать?
__________________
trace("Остановите Землю, я сойду!!!");

Старый 01.06.2009, 16:21
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 7  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
типа "O-сложность алгоритмов"
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 01.06.2009, 19:57
Яски вне форума Посмотреть профиль Отправить личное сообщение для Яски Найти все сообщения от Яски
  № 8  
Ответить с цитированием
Яски

блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
Цитата:
Сообщение от Smrad Посмотреть сообщение
О(n^2)
неа O(n)

Добавлено через 24 минуты
И еще один алгоритм до кучи, этот хорош, если есть объекты разной степени важности(приоритета) их нужно упорядочить, но при этом внести некоторую случайность.
Код AS3:
{
   var array:Array = [new Card("десять"), new Card("валет", 0.2), new Card("туз", 0.5)];
   for each (var card:Card in array) {
      // Может быть любая другая функция, 
      // все зависит от того, как сильно приоритет влияет на выбор.
      card.sortPriority = Math.random() + card.priority;
   }
   array.sortOn("sortPriority", Array.DESCENDING | Array.NUMERIC);
}
 
class Card {
   public var name:String;
   public var priority:Number;
   public var sortPriority:Number;
   public function Card(name:String, priority:Number = 0) {
      this.name = name;
      this.priority = priority;
   }
}
Этот способ я использовал для одного проекта, там должны были появляться цели, те, что были ближе к игроку имели выше приоритет и выбирались чаще первыми.
__________________
TankiOnline
Я разработчик Alternativa3D


Последний раз редактировалось Яски; 01.06.2009 в 20:23.
Старый 02.06.2009, 11:02
Smrad вне форума Посмотреть профиль Отправить личное сообщение для Smrad Найти все сообщения от Smrad
  № 9  
Ответить с цитированием
Smrad

Регистрация: Nov 2008
Сообщений: 205
Отправить сообщение для Smrad с помощью ICQ
Цитата:
Сообщение от Яски Посмотреть сообщение
неа O(n)
Только сам splice уже имеет O(n), потому все варианты со splice'ом квадратичные. Варианты с сортировкой должны быть побыстрее, но сама сортировка это O(n*log(n)). Что-то мне подсказывает что нормальный алгоритм должен иметь линейную сложность.

Добавлено через 15 минут
Сам алгоритм, в принципе, очевиден. Просто нужен random, выдающий _неповторяющиеся_ числа от 0, до arr.length.

Создать новую тему Ответ Часовой пояс GMT +4, время: 00:41.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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