• Авторизация


Шедевр 04-12-2009 08:43 к комментариям - к полной версии - понравилось!


function grad_rand($from,$to,$pow,$prec,$straight=false)
{
$prec=pow(10,$prec);
$number=floor($prec*pow(mt_rand(0,pow($to-$from,$pow)),1/$pow))/$prec;
if ($straight==false) $number=($to-$from)-$number;
$number = $number + $from;
return $number;
}

Объявляется конкурс. Кто угадает, что делает эта функция?
вверх^ к полной версии понравилось! в evernote
Комментарии (12):
__ivanhoe 04-12-2009-10:15 удалить
> $number=floor($prec*pow(mt_rand(0,pow($to-$from,$pow)),1/$pow))/$prec;

Тут пахнет переходом от равномерного распределения к нормальному (или к другому?..)

> if ($straight==false) $number=($to-$from)-$number;

Хз, что такое $straight )
нуууу... нуууу.... ну же, давай
__ivanhoe 06-12-2009-09:13 удалить
А, я и думать бросил :)
Щас посоображаю.
__ivanhoe 07-12-2009-13:48 удалить
В общем, что я надумал.

> $prec=pow(10,$prec);
prec — от precision
В этой строке переходим от точности в виде числа знаков к десятичному виду
2 знака -> 100
3 знака -> 1000
Это используется при округлении в следующей строке.

В следующей строке главное вот это:
> pow(mt_rand(0,pow($to-$from,$pow)),1/$pow)
Что делается понял, зачем — не понял.

>if ($straight==false) $number=($to-$from)-$number;
>$number = $number + $from;

Логичнее было бы записать наоборот:
$number = $number + $from;
if ($straight==false) $number=($to-$from)-$number;

Т.к. $number = $number + $from; относится еще к генерации случайной величины.
А вот if ($straight==false)... это уже к какой-то непонятной мне нормализации.
Исходя из названия функции grad_rand, в котором grad явно намекаэ на градусы, то можно предположить, что $straight имеет смысл «прямой». Тогда суть нормализации понятна — не давать полученному углу вылезать за границы 90°.

Как-то так, больше раскуривать лень )
это генератор случайных чисел с неравной вероятностью выпадения тех или иных числе.
Точнее, с прямой или обратной зависимостью между вероятностью и величиной числа.

Интересно подробней?
__ivanhoe 09-12-2009-08:58 удалить
Интересно нахуа он нужен
мало ли. Мне нужен для генерации колебания курса валют. Существует бОльшая вероятность, что курс изменится незначительно. Однако не исключено, что и может скакнуть...
__ivanhoe 09-12-2009-13:03 удалить
Нормальное распределение не катит штоле?
совсем. Смотри, нужно симулировать реальное изменение цен. Цены обычно меняются незначительно, но не исключены и большие изменения. :)
__ivanhoe 12-12-2009-12:18 удалить
Ответ на комментарий Габриэль_ВанХельсинг # Так?
[546x436]
Ответ на комментарий __ivanhoe # ^) именно. кривая может быть любой, но смысл именно такой
__ivanhoe 06-05-2010-00:47 удалить
Короче, можно сорт оф такое:

function gauss($M=0.0, $sigma=1.0)
{
// два числа с равномерным распределением от 0 до 1
$x=(float)rand() / (float)getrandmax();
$y=(float)rand() / (float)getrandmax();

// число с гауссовым распределением от с матожиданием 0, дисперсией 1
$g = sqrt(-2 * log($x)) * cos(2 * pi() * $y);

// число с требуемым матожиданием и дисперсией
return $g * $sigma + $M;
}

График будет как я нарисовал, только в отрицательную область продолжается еще. А потом играть можно как хочешь.


Комментарии (12): вверх^

Вы сейчас не можете прокомментировать это сообщение.

Дневник Шедевр | Габриэль_ВанХельсинг - I have another wind to ride! | Лента друзей Габриэль_ВанХельсинг / Полная версия Добавить в друзья Страницы: раньше»