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

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

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

Регистрация: Jul 2011
Сообщений: 249
Отправить сообщение для mihael_p с помощью Skype™
По умолчанию Как "перемешать" элементы в массиве?

Есть определенный массив:
Код AS3:
private var someDigits:Array = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
как отсортировать массив - понятно, а вот как перемешать его - нет.
Подскажите, пожалуйста, как быть?
__________________
Не стыдно спросить, стыдно не знать !

Старый 12.11.2012, 12:28
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 2  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Как-то ваял.
Код AS3:
package ru.kordum.utils {
 
	/**
	 * @author KorDum
	 */
 
	public class ArrayShuffler {
		private static var _array:Array;
 
		//---------------------------------------------------------------------------
		//
		// CONSTRUCTOR
		//
		//---------------------------------------------------------------------------
 
		public function ArrayShuffler() {
 
		}
 
 
		//---------------------------------------------------------------------------
		//
		// PRIVATE STATIC METHODS
		//
		//---------------------------------------------------------------------------
 
		private static function startRandomize():void {
			var length:uint = _array.length;
 
			while (length--) {
				var n:int = Math.random() * (length + 1);
				swap(length, n);
			}
		}
 
 
		private static function swap(x:uint, y:uint):void{
			var temp:* = _array[x];
			_array[x] = _array[y];
			_array[y] = temp;
		}
 
 
		//---------------------------------------------------------------------------
		//
		// PUBLIC STATIC METHODS
		//
		//---------------------------------------------------------------------------
 
		public static function randomize(array:Array, count:uint = 1):Array {
			if (!array) return null;
 
			_array = array.slice();
 
			for (var i:uint = 0; i < count; i++) {
				startRandomize();
			}
 
			return _array;
		}
	}
}
__________________
тут я

Старый 12.11.2012, 13:01
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 3  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Код AS3:
public static function shuffle(array:Array):void
{
	var t:*;
	var r:int;
	var i:int = array.length;
	while (i) 
	{
		r = Math.floor(Math.random() * i--);
		t = array[i];
		array[i] = array[r];
		array[r] = t;
	}
}

Старый 12.11.2012, 13:31
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 4  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
У меня то же самое, но с приведением рандома с нормальных законом распределения к более-менее равномерному (у Чуви взял). Последствия очевидны.
__________________
тут я

Старый 12.11.2012, 13:49
mihael_p вне форума Посмотреть профиль Отправить личное сообщение для mihael_p Посетить домашнюю страницу mihael_p Найти все сообщения от mihael_p
  № 5  
Ответить с цитированием
mihael_p

Регистрация: Jul 2011
Сообщений: 249
Отправить сообщение для mihael_p с помощью Skype™
КорДум спасибо огромное, то что нужно
__________________
Не стыдно спросить, стыдно не знать !

Старый 12.11.2012, 13:51
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 6  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Цитата:
но с приведением рандома с нормальных законом распределения к более-менее равномерному
В моём примере какое-то другое распределение?

Старый 12.11.2012, 13:56
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 7  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
По идее, нормальное ) Math.random() в as3 живет по этому закону. Чуви проводил эксперименты, рисовал графики. Потом дошел до метода какого-то там, наваял код, приводящий нормальное к равномерному, а я нагло стырил.

Добавлено через 8 минут
А хотя по коду то же самое вообще у нас. Разве что у меня несколько раз можно "шуффлировать".
__________________
тут я

Старый 12.11.2012, 16:25
strangedk вне форума Посмотреть профиль Отправить личное сообщение для strangedk Найти все сообщения от strangedk
  № 8  
Ответить с цитированием
strangedk
 
Аватар для strangedk

Регистрация: Oct 2010
Адрес: Харьков
Сообщений: 616
Записей в блоге: 1
Отправить сообщение для strangedk с помощью ICQ Отправить сообщение для strangedk с помощью Skype™
Код AS3:
var _source:Array = [1,2,3,4,5,6,7,8,9,0];
var _result:Array = [];
 
while (_source.length > 0) {
    _result.push(_source.splice(Math.round(Math.random() * (_source.length - 1)), 1)[0]);
}
__________________
adobe AS3 manual

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

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Сообщение от strangedk Посмотреть сообщение
Код AS3:
var _source:Array = [1,2,3,4,5,6,7,8,9,0];
var _result:Array = [];
 
while (_source.length > 0) {
    _result.push(_source.splice(Math.round(Math.random() * (_source.length - 1)), 1)[0]);
}
Не знаю, более ли этот вариант правильное распределение даёт, чем предыдущие, но сплайсить массив n раз дорого - сложность почти n * n + затраты на выделение памяти и сборку мусора.
Math.round(Math.random() * (_source.length - 1)) вроде бы эквивалентно int(Math.random() * _source.length), не?
Как написать то же самое (1 в 1), но без сплайса и без создания другого массива (линейная сложность ):
Код AS3:
public static function shuffle(array:Array):void {
	var length:int = array.length;
	while (length > 0) {
		var index:int = int(Math.random() * length);
		var value:int = array[index];
 
		// Элемент выбран, появилась дырка - заделываем элементом с условного конца
		// и у нас снова ровный массив из оставшихся элементов
		array[index] = array[length - 1];
 
		// Кидаем выбранный элемент в текущий условный конец массива - там выборки уже не будет
		// Т.е. слева у нас старый массив - справа строим новый
		array[length - 1] = value;
 
		// Левый (исходный) массив поубавился
		length--;
	}
}


Последний раз редактировалось expl; 12.11.2012 в 21:32.
Старый 25.11.2012, 13:03
Nikem79 вне форума Посмотреть профиль Отправить личное сообщение для Nikem79 Найти все сообщения от Nikem79
  № 10  
Ответить с цитированием
Nikem79

Регистрация: Aug 2006
Сообщений: 35
Цитата:
Сообщение от strangedk Посмотреть сообщение
Код AS3:
var _source:Array = [1,2,3,4,5,6,7,8,9,0];
var _result:Array = [];
 
while (_source.length > 0) {
    _result.push(_source.splice(Math.round(Math.random() * (_source.length - 1)), 1)[0]);
}
У меня код работает в таком виде:

Код AS3:
var _source:Array = [1,2,3,4,5,6,7,8,9,0,11,12,13,14,15];
var _result:Array = [];
 
while (_source.length > 0) {
    _result.push(_source.splice(Math.round(Math.random() * (_source.length - 1)), 1)[0]);
	trace(_result[_source]);
}
 
trace("Дальше");
 
for(var six:int=0;six<15;six++){
	trace(_result[six]);
}
Подскажите пожалуйста, а как сделать количество перемешиваемых чисел переменной?
Чтобы в строчку его можно было поместить

N=50;
вместо var _source:Array = [1,2,3,4,5,6,7,8,9,0];
это: var _source:Array = [N];

и чтобы в итоге перемешивались не 10 данных, а сколько понадобится?..

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

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

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


 


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


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