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

Вернуться   Форум Flasher.ru > Архив Flasher.ru > Flash > ActionScript

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 01.07.2004, 13:24
  № 1  
netCat
Guest

Сообщений: n/a
По умолчанию Случайная сортировка элементов массива

нужна помощь

есть мульти массив
необходимо создать функцию создающую новый массив, равный по длинне начальному,и состоящий из элементов старого, взятых рэндомом, но не повторяющихся

знает ли кто нибудь решешение???

Старый 01.07.2004, 15:16
Lego вне форума Посмотреть профиль Отправить личное сообщение для Lego Найти все сообщения от Lego
  № 2  
Lego
 
Аватар для Lego

Регистрация: Nov 2001
Адрес: Днепропетровск
Сообщений: 107
Отправить сообщение для Lego с помощью ICQ
Я делал это так (возможно, не самый элегантный способ).
Смысл следующий: выбирается случайным способом номер элемента массива и переставляется с первым, и так count-раз.

function ArrayShuffle(arr)
{

//можно + 100, + 1000. Чем больше цифра, тем тщательнее
//перемешается

var cnt = arr.length + 10;

for(var i = 0; i < cnt; i++)
{
var index = random(arr.length - 1) + 1;
var tmp = arr[0];
arr[0] = arr[index];
arr[index] = tmp;
}
}
__________________
Я не любопытный и хитрый, а любознательный и сообразительный!


Последний раз редактировалось Lego; 01.07.2004 в 15:26.
Старый 01.07.2004, 16:16
DeliMIter вне форума Посмотреть профиль Отправить личное сообщение для DeliMIter Найти все сообщения от DeliMIter
  № 3  
DeliMIter
некрофил
 
Аватар для DeliMIter

Регистрация: Mar 2002
Адрес: ...по колено в кровище...
Сообщений: 2,292
Код:
function shuffle(suxx) {
  for (var i=0; i<suxx.length; i++) {
    var index = random(suxx.length);
    suxx.push(suxx[index]);
    suxx.splice(index, 1);
  }
}
__________________
...убивать людей не удовольствия ради, но для еды.

Старый 01.07.2004, 16:54
Nox Noctis вне форума Посмотреть профиль Отправить личное сообщение для Nox Noctis Посетить домашнюю страницу Nox Noctis Найти все сообщения от Nox Noctis
  № 4  
Nox Noctis
don't panic!
 
Аватар для Nox Noctis

Регистрация: Aug 2001
Сообщений: 4,121
2DeliMIter
тоже вариант, но перемешивание слабое.
ты берёшь элемент из любой ячейки и кладёшь его в последнюю. то есть можно взять последний элемент и положить его в последнюю ячейку. а можно два раза сделать то же самое. а можно три - как рандом выпадет...


Последний раз редактировалось Nox Noctis; 01.07.2004 в 16:56.
Старый 01.07.2004, 16:57
DeliMIter вне форума Посмотреть профиль Отправить личное сообщение для DeliMIter Найти все сообщения от DeliMIter
  № 5  
DeliMIter
некрофил
 
Аватар для DeliMIter

Регистрация: Mar 2002
Адрес: ...по колено в кровище...
Сообщений: 2,292
Вероятность того, что массив окажется неперемешанным - 2 в степени минус длины массива. Особо гнобливые и придирчивые могут не брать последний элемент.
__________________
...убивать людей не удовольствия ради, но для еды.

Старый 01.07.2004, 17:13
Nox Noctis вне форума Посмотреть профиль Отправить личное сообщение для Nox Noctis Посетить домашнюю страницу Nox Noctis Найти все сообщения от Nox Noctis
  № 6  
Nox Noctis
don't panic!
 
Аватар для Nox Noctis

Регистрация: Aug 2001
Сообщений: 4,121
хе-хех.. так я же не о ПОЛНОМ неперемешивании массива.
какова для каждого элемента вероятность того что он окажется неперемешанным?

Старый 01.07.2004, 17:29
DeliMIter вне форума Посмотреть профиль Отправить личное сообщение для DeliMIter Найти все сообщения от DeliMIter
  № 7  
DeliMIter
некрофил
 
Аватар для DeliMIter

Регистрация: Mar 2002
Адрес: ...по колено в кровище...
Сообщений: 2,292
Реверс - и массив уж не такой, как был вчера... Можно придумать сколько угодно алгоритмов. Можно перемешивать хорошо, но не случайно, например вторую половину реверсом через один с первой - и так восемь раз. Вопрос, нужно ли?
__________________
...убивать людей не удовольствия ради, но для еды.

Старый 01.07.2004, 17:41
fmsmith вне форума Посмотреть профиль Отправить личное сообщение для fmsmith Найти все сообщения от fmsmith
  № 8  
fmsmith

Регистрация: Nov 2001
Адрес: и провыплёвывает
Сообщений: 26
Код:
var aArr=....;//твой массив
var nTest,nTemp:Number;
var nLim=aArr.length;
for (var nI=0; nI<nLim; nI++){
    do{
          nTest=random(nLim);
     }while(nTest==nI);
			
    nTemp=aArr[nI];
    aArr[nI]=aArr[nTest];				      
    aArr[nTest]=nTemp;		
}

Старый 01.07.2004, 17:50
Nox Noctis вне форума Посмотреть профиль Отправить личное сообщение для Nox Noctis Посетить домашнюю страницу Nox Noctis Найти все сообщения от Nox Noctis
  № 9  
Nox Noctis
don't panic!
 
Аватар для Nox Noctis

Регистрация: Aug 2001
Сообщений: 4,121
тоже работает.. но лишние итерации мне лично не нравятся..

Старый 01.07.2004, 17:56
Nox Noctis вне форума Посмотреть профиль Отправить личное сообщение для Nox Noctis Посетить домашнюю страницу Nox Noctis Найти все сообщения от Nox Noctis
  № 10  
Nox Noctis
don't panic!
 
Аватар для Nox Noctis

Регистрация: Aug 2001
Сообщений: 4,121
еще вариант - итераций ровно столько сколько элементов в массиве, но при этом приходится дублировать массив.
Код:
Array.prototype.shuffle = function() {
	var dummy = this.concat();
	while (dummy.length) {
		var rnd = random(dummy.length);
		var item = dummy[rnd];
		this.splice(this.length-dummy.length, 1, item);
		dummy.splice(rnd, 1);
	}
};
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
a.shuffle();
trace(a);

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

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

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


 


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


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