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

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

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

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
По умолчанию Детеминированный рандом?

Есть потребность в многократном получении одной и той же последовательности псевдослучайных чисел, равномерно распределенных по диапазону. Скажем, от 1 до 100. При этом должно быть несколько вариантов этой последовательности, скажем, тоже штук 100.

По идее, генератор должен инициализироваться каким-то значением и потом при запросе чисел выдавать одну и ту же последовательность. При этом, при инициализации разными начальными параметрами, последовательности должны получаться разные. Может кто видел готовое решение?

ЗЫ. Была идея сделать совсем тупо - нагенерить массив из 1000 случайных чисел и потом просто брать фрагменты этого массива, но может есть простое математическое решение?

ЗЗЫ. Линейно-конгруэнтный метод я уже попробовал. Не понравилось.

Старый 07.03.2014, 21:37
Aquahawk вне форума Посмотреть профиль Отправить личное сообщение для Aquahawk Посетить домашнюю страницу Aquahawk Найти все сообщения от Aquahawk
  № 2  
Ответить с цитированием
Aquahawk
 
Аватар для Aquahawk

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
Цитата:
Линейно-конгруэнтный метод я уже попробовал. Не понравилось.
А подробности? Что значит не понравился, плахой рандом нагенерил? Не смогу посоветовать что-либо если не понимать чем классика не устраивает.
__________________
:)

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

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Попробовал несколько вариантов, которые нагуглил, но при проверке ни один из них полного равномерного покрытия не обеспечил. Скажем, если рандом в интервале 1..100, то при хотелось бы иметь все 100 значений.

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Так Вам не случайность нужна вообще, а перемешивание.
__________________
Reality.getBounds(this);

Старый 08.03.2014, 07:47
ChuwY вне форума Посмотреть профиль Отправить личное сообщение для ChuwY Посетить домашнюю страницу ChuwY Найти все сообщения от ChuwY
  № 5  
Ответить с цитированием
ChuwY
 
Аватар для ChuwY

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
Все-таки хотелось бы услышать более точную формулировку задачи.
Поисковый запрос "random seed actionscript" выдает кучу вариантов.
Под рукой пока, увы, нет.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.

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

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Более точная формулировка задачи выглядит так:

Код AS3:
// нужен некоторый класс RandomDt, который выдает случайные числа в диапазоне от 0 
// до некоторого лимита (напр., 10) в зависимости от некоторого параметра (напр., 1234567 ), 
// который указывается при инициализации: RandomDt.init( 10, 1234567 )
 
var rand1 : Array() = [];
var rand2 : Array() = [];
var rand3 : Array() = [];
var i : int;
 
// серия 1
RandomDt.init( 10, 1234567 );
for ( i = 0; i < 1000; i++ ) {
   rand1.push( RandomDt.getValue() );
}
 
// серия 2
RandomDt.init( 10, 987654 );
for ( i = 0; i < 1000; i++ ) {
   rand2.push( RandomDt.getValue() );
}
 
// серия 3
RandomDt.init( 10, 1234567 );
for ( i = 0; i < 1000; i++ ) {
   rand3.push( RandomDt.getValue() );
}
 
// по итогам испытаний должно получиться:
// - rand1 эквивалентен rand3
// - rand2 отличается от rand1, rand3
// - rand1, rand2, rand3 запонены числами от 0 до 9, при 
//   этом все числа встречаются с примерно равной 
//   частотой

Старый 08.03.2014, 19:44
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 7  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Заполнить массив из 1000 элементов пачками [0...9], тогда числа будут присутствовать в (примерно) равной пропорции, и перемешать получившийся массив по какому-то алгоритму с параметром, имитирующему случайность перемешивания. Перемешивая массив просто случайным образом не добиться п.1. За алгоритм сейчас не скажу, думать надо .
Например, можно в пачках [0...9] перед заполнением задавать определенный порядок чисел (таких вариантов будет 10! = 3628800, если я ничего не путаю), а заполнять и перемешивать большой массив уже каким-то статическим алгоритмом (без параметра). Можно попробовать за основу взять битмап дату 1х1000 и что-то мутить с пиксельной информацией, сид как-то привязать к цвету...


Последний раз редактировалось alexcon314; 08.03.2014 в 19:59.
Старый 09.03.2014, 11:47
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 8  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Цитата:
Заполнить массив из 1000 элементов
Это я в самом начале написал.
И, видимо, так и сделаю.

Единственно, не совсем понятно, почему все время всплывает тема с перемешиванием. Вот как работает штатный Math.random():

Код AS3:
var rands:Array = [];
var count:int = 1000;
 
for ( var i:int = 0; i < count; i++ ) {
	var randIndex:int = int( Math.random() * 10 );
	rands[randIndex] = int( rands[randIndex] ) + 1;	
}
 
for ( var j:int = 0; j < 10; j++ ) {
	trace( j, '=>', Math.floor( rands[j] / ( count / 1000 ) ) / 10, '%' );
}
выдает:

Код:
0 => 10.8 %
1 => 9.8 %
2 => 8.3 %
3 => 8.2 %
4 => 10.3 %
5 => 11.8 %
6 => 9.2 %
7 => 9 %
8 => 10.3 %
9 => 12.3 %
Т.е., очевидно, что разброс есть, но при увеличении числа испытаний он будет нивелироваться. Мне нужно то же самое, только с возможностью начальной инициализации.

Старый 09.03.2014, 12:17
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 9  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Вы же потребовали, чтобы был параметр инициализации, условно говоря "сид", обеспечивающий уникальность и воспроизводимость набора.
Вы не сможете удовлетворить этому требованию, если заполнять массив через random(). Не получится на 100% воспроизвести результат предыдущего заполнения. Или вы как-то иначе себе это представляете?
Почему перемешивание? Потому что ваша задача по-сути комбинаторная, а не статистическая. Перемешивание - суть перестановка заранее известного неизменяемого набора элементов. По крайней мере, формулировка задачи наводит именно на такой подход.
Немного раскрою свою мысль, если вы не поняли. Пачку [0...9] можно перед добавлением в массив из 1000 зараннее перемешать, одним из известных вам спосбов, назовем условно это "паттерном заполнения". Добавляем последовательно пачки в массив. Потом, 1000 элементов нужно переставить по какому-то однозначному и обратимому алгоритму, типа как это делается в случае со случайным перемешиванием, но только без рандома . Ну, переставим местами чет-нечет и потом пройдемся по каждой пачке реверсом со смещением на 3 .. или еще как-то..насколько фантазии хватит.
На выходе должен получится массив из все тех же чисел, встречающихся в равной пропорции и в порядке, прямо зависящем от способа первоначального перемешивания пачки [0...9]. Т.е. удовлетворяем условиям: "непохожесть" выхлопа для двух разных паттернов заполнения и обеспечиваем воспроизводимость выхлопа при одинаковых паттернах. Ну, и внешне такой выхлоп вряд ли сильно будет отличаться от результата рандомного заполнения . При таком подходе имеем 10! возможных вариантов выхлопов.

Написал, и как-то вспомнилось про криптографию. Может в эту сторону посмотреть?


Последний раз редактировалось alexcon314; 09.03.2014 в 12:39.
Старый 09.03.2014, 18:00
Aquahawk вне форума Посмотреть профиль Отправить личное сообщение для Aquahawk Посетить домашнюю страницу Aquahawk Найти все сообщения от Aquahawk
  № 10  
Ответить с цитированием
Aquahawk
 
Аватар для Aquahawk

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
Ваш же код выполнен 1000 000 итераций и убрал транкейт в результате
Код AS3:
0 => 10.0518 %
1 => 10.005799999999999 %
2 => 9.960099999999999 %
3 => 10.0067 %
4 => 10.0224 %
5 => 9.9896 %
6 => 10.0302 %
7 => 9.975000000000001 %
8 => 9.997 %
9 => 9.9614 %
вы хотите на 1000 итераций на 10 групп получить абсолютно равномерное распределение и при этом хотите чтобы это был рандом? чего-то вы не того хотите.
__________________
:)

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

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

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


 


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


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