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

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

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

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
По умолчанию Нормальный закон распределения случайных чисел

Задался таким, собственно, вопросом
Кто-нибудь уже реализовывал/сталкивался с нормальным распределением случайных чисел в AS3?

Погуглив, нашел только очень приближенные реализации или же ссылки на теоремы (мол, разбирайтесь и реализуйте сами).

Может кто-то знаком с легковесными библиотеками, или делал что-то сам?
===============
Пока наиболее оправданным найденным решением оказалсь реализация "Центральной предельной теоремы".Но там не понятно как задавать дисперсию


Последний раз редактировалось KumoKairo; 05.06.2013 в 14:51.
Старый 05.06.2013, 15:08
zuxul вне форума Посмотреть профиль Отправить личное сообщение для zuxul Найти все сообщения от zuxul
  № 2  
Ответить с цитированием
zuxul

Регистрация: Dec 2009
Адрес: 59°13′N, 39°54′E
Сообщений: 445
Записей в блоге: 1
Википедия подсказывает о преобразовании Бокса-Мюллера. Ну а гугол по предыдущей фразе и добавлением магических "as3" дал ссылку: http://blog.controul.com/2009/04/sta...bution-in-as3/

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

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Ух, отличная статейка! Там еще и равномерное распределение есть!

Сам автор пишет что самым простым и недорогим способом реализации будут таблицы со значениями..
Однако реализация интересная)
Интересно сравнить с реализацией той центральной предельной теоремы)

Отпишусь как сделаю

Спасибо за ответ!

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

Регистрация: Sep 2006
Сообщений: 145
Равномерное распределение получается простым рандомом
Нормальное распределение получается с помощью среднего значения от обычного рандома и энтропийного
Что то такого рода
Код AS3:
private function rand1 (n:int):int {
	var r:int = Math.floor (Math.random () * n);
	return r;
}
private function rand2 (n:int):int {
	var r:int = getTimer () % n;
	return r;
}
private function rand3 (n:int):int {
	var r:int = Math.floor ((rand1 (n) + rand2 (n)) / 2);
	return r;
}
Миниатюры
Нажмите на изображение для увеличения
Название: random.jpg
Просмотров: 126
Размер:	649.0 Кб
ID:	29624  


Последний раз редактировалось iNils; 06.06.2013 в 14:50.
Старый 06.06.2013, 14:58
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 5  
Ответить с цитированием
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Ну вот ранд3 это и есть реализация Центральной Предельной Теоремы, только я использовал 4 рандомных числа, а не 2

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

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Оно уже и при 3-х неэнтропийных похоже получается (и симметричнее выглядит):
Название: random.png
Просмотров: 901

Размер: 5.9 Кб
Код AS3:
package {
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.events.Event;
 
	public class Main extends Sprite {
		private static const COUNT:int = 800;
 
		public function Main() {
			var counts:Vector.<int> = new Vector.<int>(COUNT);
			var i:int;
			var j:int;
			var index:int;
			for (i = 0; i < COUNT; i++) {
				counts[i] = 0;
			}
			var bd:BitmapData = new BitmapData(COUNT, 500);
			for (i = 0; i < 100000; i++) {
				index = rand3(COUNT);
				counts[index]++;
				bd.setPixel(index, int(counts[index] * .5), 0xff0000);
			}
			addChild(new Bitmap(bd));
		}
 
		private function rand1(n:int):int {
			var r:int = Math.floor(Math.random() * n);
			return r;
		}
 
		private function rand3(n:int):int {
			var r:int = Math.floor((rand1(n) + rand1(n) + rand1(n)) / 3);
			return r;
		}
	}
}
При сумме 2-х почему-то выглядит как треугольник
Нажмите на изображение для увеличения
Название: random2.png
Просмотров: 148
Размер:	4.6 Кб
ID:	29626

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

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Чем больше переменных тем ближе к нормальному распределению)
В самой теореме вообще говорится о бесконечном ряде несвязанных значений

Способ товарища Парка Миллера не впечатлил, там выдаются рандомные значения с математическим ожиданием равным 0 и непонятной дисперсией. То есть выдает случайные числа от минус пяти-шести до пяти-шести с плюсом

Учитывая это, числа еще придется приводить к диапазону (0, 1), с мат. ожиданием 0.5, а это дополнительные вычисления
Со всем вышесказанным получаем такую картину:
Сравнение реализации Парка Миллера с реализацией expl (Синим - Парк Миллер)
Нажмите на изображение для увеличения
Название: rasp.png
Просмотров: 105
Размер:	7.5 Кб
ID:	29627
Код AS3:
package {
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.events.Event;
 
	public class Main extends Sprite {
		private static const COUNT:int = 800;
		private var parkMiller:ParkMiller;
 
		public function Main() {
 
			parkMiller= new ParkMiller();
 
			var counts:Vector.<int> = new Vector.<int>(COUNT);
			var countsParkMiller:Vector.<int> = new Vector.<int>(COUNT);
			var i:int;
			var j:int;
			var index:int;
			for (i = 0; i < COUNT; i++) {
				counts[i] = 0;
				countsParkMiller[i] = 0;
			}
			var bd:BitmapData = new BitmapData(COUNT, 500);
			var bdParkMiller:BitmapData = new BitmapData(COUNT, 500);
 
			for (i = 0; i < 100000; i++) {
				index = rand3(COUNT);
				counts[index]++;
				bd.setPixel(index, int(counts[index] * .5), 0xff0000);
			}
 
			for (i = 0; i < 100000; i++)
			{
				index = Math.abs(randParkMiller(COUNT));
				index = index >= 800 ? 799: index;
				index = index < 0 ? 0 :index;
				countsParkMiller[index]++;
				bdParkMiller.setPixel(index, int(countsParkMiller[index] * .5), 0x0000ff);
			}
			addChild(new Bitmap(bd));
			var bPark:Bitmap = new Bitmap(bdParkMiller);
			bPark.y = 300;
			addChild(bPark);
 
		}
 
		private function rand1(n:int):int {
			var r:int = Math.floor(Math.random() * n);
			return r;
		}
 
		private function rand3(n:int):int {
			var r:int = Math.floor((rand1(n) + rand1(n) + rand1(n)) / 3);
			return r;
		}
 
		private function randParkMiller(n:int):int
		{
			var r:int = this.parkMiller.standardNormal() * 100 + 400;
			return r;
		}
	}
}
Класс ParkMiller находится по ссылке из второго поста
в функции генерации мат ожидание равно 400, стандартная дисперсия умножена на 100

С учетом всех преобразований и условностей (проверка на выход за границы массива) получаем следующее время выполнения:
способ Парка Миллера - 111 мс
Способ, реализованный товарищем expl (с тремя значениями) - 173 мс
Первый способ, которым я воспользовался (4 переменные) - 98 мс

Сравнение моей реализации с Парком Миллером (синим - Парк Миллер):
Нажмите на изображение для увеличения
Название: rasp1.png
Просмотров: 104
Размер:	7.9 Кб
ID:	29628
Код функции:
Код AS3:
		private function rand4(n:Number):int
		{
			var r1:Number = Math.random() * n;
			var r2:Number = Math.random() * n;
			var r3:Number = Math.random() * n;
			var r4:Number = Math.random() * n;
			var ret:Number = Math.round((r1 + r2 + r3 + r4) / 4);
			return ret;
		}
При увеличении количества переменных (до 10) растет время выполнения (163 мс) и уменьшается дисперсия:
Нажмите на изображение для увеличения
Название: rasp2.png
Просмотров: 120
Размер:	7.6 Кб
ID:	29629

В общем, сдается мне, надо смотреть в сторону Алгоритма Зиггурата, про который написано в конце статьи)


Последний раз редактировалось KumoKairo; 07.06.2013 в 11:12.
Старый 07.06.2013, 14:32
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 8  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Простите, а какая задача решалась?
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

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

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Мне надо было рандомно расположить цветочки, но таким образом, чтобы к центру экрана их плотность была бы больше, чем к краям)

В итоге от реализации с нормальным распределением (и от размещения в центре) отказался, сделал совсем по-другому (расположил цветочки по трем направляющим с равномерным разбросом).
Но вопрос оказался интересным


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

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

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


 


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


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