Вверх ↑
Этот топик читают: Гость
Ответов: 2059
Рейтинг: 132
#1: 2016-10-10 21:28:02 ЛС | профиль | цитата
Нужны были случайные числа, распределенные по нормальному закону распределения с заданным математическим ожиданием и дисперсией.
Где то так:
function Gauss(Mx, Sigma: Extended): Extended;
var
a, b, r, Sq: Extended;
begin
repeat
a := 2 * Random - 1;
b := 2 * Random - 1;
r := Sqr(a) + Srq(b);
until r ‹ 1;
Sq := Sqrt(-2 * Ln(r) / r);
Result := Mx + Sigma * a * Sq;
end;
Но оказалось, что в kolmath.pas есть нормально распределенные Гаусса.
{ RandG produces random numbers with Gaussian distribution about the mean.
Useful for simulating data with sampling errors. }
function RandG(Mean, StdDev: Extended): Extended;

nesco, может добавишь строчку в hiMathParse, или в hiRandom?
карма: 6

0
Ответов: 8926
Рейтинг: 823
#2: 2016-10-10 21:44:22 ЛС | профиль | цитата
flint2, в Random уже добавлено на SVN
карма: 19

0
Ответов: 2059
Рейтинг: 132
#3: 2016-10-10 21:45:43 ЛС | профиль | цитата
Леонид, Благодарю!!!
карма: 6

0
Ответов: 2059
Рейтинг: 132
#4: 2016-10-16 22:58:25 ЛС | профиль | цитата
Ребята, моя не понимать!
Как же мне рулить с этой ассемблерной штукой?
Да, есть такая штука (в ассемблере пестрит в инете).
Но нужно то рулить корреляцияцией, а не от и до. (По этому делаю в IC)
Важна ширшина и форма https://en.wikipedia.org/wiki/Normal_distribution
Что выше приводил из kolmath.pas - вполне.
В двух словах - делаю для внука случайные ландшафты для уровней (есть хорошие программы для ландшафтов и растительности, но приручить крайне неудобно. Делал конвертацию... Лучше сделать своё)
MAV
Есть старый https://yadi.sk/d/BVyAReZ3wxb8x и новый https://yadi.sk/d/jT88yqpywxb7M
Так со старым все шейдеры и текстуры идут, как из пистолета (хотя не спец, я только учусь), а новый (какой сейчас) - то не компилируется, то хрень какая то.
Чего я не догоняю?

Редактировалось 5 раз(а), последний 2016-10-17 01:23:30
карма: 6

0
Ответов: 8926
Рейтинг: 823
#5: 2016-10-17 01:30:10 ЛС | профиль | цитата
flint2, точки Min Max оставлены чтобы вид кубика был прежний
Min = Медиана - Отклонение
Max = Медиана + Отклонение
Схемка


Add(MainForm,2953706,182,154)
{
Height=544
link(onCreate,9928803:doRandomize,[(299,174)(299,223)])
}
Add(Random,9928803,336,210)
{
Min=-0.5
Max=0.5
Mode=2
Point(doMin)
Point(doMax)
Point(Min)
Point(Max)
link(onRandom,8424576:doEvent1,[])
link(Min,14505081:Var2,[])
link(Max,73163:Var2,[])
}
Add(For,843543,252,210)
{
End=10000
link(onEvent,9928803:doRandom,[])
link(onStop,4799661:doEnum,[(291,223)(291,293)])
}
Add(Button,1435072,182,196)
{
Left=10
Top=5
link(onClick,13417803:doEvent1,[])
}
Add(Edit,6322368,301,70)
{
Left=185
Top=5
Text="0"
DataType=4
link(onChange,4283371:doWork3,[(342,76)])
}
Add(Edit,11100228,350,70)
{
Left=310
Top=5
Text="0.5"
DataType=4
link(onChange,4283371:doWork2,[(389,76)(389,57)])
}
Add(Plotter,12460140,441,77)
{
Left=10
Top=30
Width=365
Height=230
Name="MyRND"
LeftMargin=50
}
Add(PlotPoints,4412952,441,126)
{
Grapher="MyRND"
MaxValues=10001
link(ValueX,843543:Position,[(454,117)(419,117)(419,264)(258,264)])
}
Add(Hub,13417803,224,196)
{
OutCount=3
link(onEvent1,1939:doEvent1,[(395,202)(395,76)])
link(onEvent2,9616262:doEvent1,[(452,209)(452,167)])
link(onEvent3,843543:doFor,[])
}
Add(Hub,8424576,399,210)
{
link(onEvent1,4412952:doAdd,[(424,216)(424,132)])
link(onEvent2,15349590:doCalc,[])
}
Add(Label,13318445,175,91)
{
Left=150
Top=5
Width=35
Height=17
Caption="Центр"
}
Add(Label,16251060,182,98)
{
Left=270
Top=5
Width=41
Height=17
Caption="Отклон"
}
Add(Hub,2554239,308,231)
{
link(onEvent1,9928803:doMin,[])
link(onEvent2,9928803:doMax,[])
}
Add(Math,10120666,301,133)
{
OpType=1
Default=-0.5
link(onResult,10057108:doOperation,[])
link(Op1,10356950:Var2,[])
link(Op2,15452987:Var1,[(314,117)])
}
Add(Math,10057108,343,133)
{
Default=0.5
link(onResult,2554239:doEvent1,[(382,139)(382,258)(298,258)(298,237)])
link(Op1,10356950:Var3,[(349,110)])
link(Op2,15452987:Var2,[])
}
Add(GetDataEx,10356950,301,105)
{
link(Data,6322368:Text,[])
}
Add(GetDataEx,15452987,350,112)
{
link(Data,11100228:Text,[])
}
Add(HubEx,4283371,338,51)
{
Angle=2
link(onEvent,10120666:doOperation,[(291,57)(291,139)])
}
Add(Plotter,906974,511,70)
{
Left=5
Top=265
Width=375
Height=235
Name="MyNorm"
}
Add(PlotLines,3117872,588,287)
{
Grapher="MyNorm"
MaxValues=601
link(ValueX,4799661:Index,[(601,278)(580,278)(580,327)(538,327)])
}
Add(ArrayEnum,4799661,525,287)
{
link(onItem,3117872:doAdd,[])
link(Array,9505819:Var1,[(531,201)])
}
Add(Hub,1939,406,70)
{
link(onEvent1,906974:doClear,[])
link(onEvent2,12460140:doClear,[])
}
Add(MathParse,15349590,434,217)
{
DataCount=3
MathStr="(%3 - (%2 + %1)/2)/(%2 - %1)*100 + 300"
ResultType=0
link(onResult,4853324:doRead,[])
link(X1,14505081:Var3,[(440,194)])
link(X2,73163:Var3,[(447,180)])
}
Add(GetDataEx,14505081,336,189)
{
Angle=3
link(Data,10120666:Result,[(307,194)])
}
Add(GetDataEx,73163,343,175)
{
link(Data,10057108:Result,[])
}
Add(For,6361862,497,154)
{
End=600
link(onEvent,4972326:doData,[])
}
Add(StrList,4494096,595,140)
{
}
Add(Hub,9616262,462,161)
{
link(onEvent1,4494096:doClear,[(494,167)(494,195)(585,195)(585,153)])
link(onEvent2,6361862:doFor,[(487,174)(487,160)])
}
Add(DoData,4972326,539,154)
{
Data=Integer(0)
link(onEventData,4494096:doAdd,[(578,160)(578,146)])
}
Add(ArrayRW,4853324,609,217)
{
link(onRead,5328718:doOperation,[])
link(Array,9505819:Var2,[])
link(Index,15349590:Result,[(622,208)(601,208)(601,257)(440,257)])
link(Value,5328718:Result,[(629,208)(650,208)(650,257)(664,257)])
}
Add(Math,5328718,658,217)
{
Op2=1
ResultType=0
link(onResult,4853324:doWrite,[(697,223)(697,265)(592,265)(592,230)])
}
Add(GetDataEx,9505819,609,196)
{
link(Data,4494096:Array,[])
}
Add(InfoTip,3810032,259,7)
{
Info=#18:Среднее значение +|10:Отклонение|
Font=[MS Sans Serif,10,1,255,1]
Width=134
Height=165
}
карма: 19

0
Ответов: 2059
Рейтинг: 132
#6: 2016-10-17 12:20:03 ЛС | профиль | цитата
Спасибо Леонид!
Буду разбираться.
С первого раза не получилось, чего хотел.
Мне надо менять отклонение, при одной и той-же медиане, т.е. Нижний график должен менять свою "пологость" в бо`льших пределах.
Разберусь, тогда отпишусь.
Спасибо большое за пример.
карма: 6

0
Ответов: 8926
Рейтинг: 823
#7: 2016-10-17 12:44:58 ЛС | профиль | цитата
flint2, нижний график в относительных единицах, если поставить абсолютные, тогда и будет меняться "пологость" :-)
пологость


Add(MainForm,9011612,259,210)
{
Height=544
link(onCreate,9928803:doRandomize,[(376,230)(376,279)])
}
Add(Random,9928803,413,266)
{
Min=99.5
Max=100.5
Mode=2
Point(doMin)
Point(doMax)
Point(Min)
Point(Max)
link(onRandom,8424576:doEvent1,[])
link(Min,10120666:Result,[(419,250)(384,250)])
link(Max,10057108:Result,[])
}
Add(For,843543,329,266)
{
End=10000
link(onEvent,9928803:doRandom,[])
link(onStop,4799661:doEnum,[(368,279)(368,349)])
}
Add(Button,1435072,259,252)
{
Left=10
Top=5
link(onClick,13417803:doEvent1,[])
}
Add(Edit,11100228,427,126)
{
Left=310
Top=5
Text="0.5"
DataType=4
link(onChange,10120666:doOperation,[(466,132)(466,113)(368,113)(368,195)])
}
Add(Plotter,12460140,518,133)
{
Left=10
Top=30
Width=365
Height=230
Name="MyRND"
LeftMargin=50
}
Add(PlotPoints,4412952,518,182)
{
Grapher="MyRND"
MaxValues=10001
link(ValueX,843543:Position,[(531,173)(496,173)(496,320)(335,320)])
}
Add(Hub,13417803,301,252)
{
OutCount=3
link(onEvent1,1939:doEvent1,[(472,258)(472,132)])
link(onEvent2,9616262:doEvent1,[(529,265)(529,223)])
link(onEvent3,843543:doFor,[])
}
Add(Hub,8424576,476,266)
{
link(onEvent1,4412952:doAdd,[(501,272)(501,188)])
link(onEvent2,15349590:doCalc,[])
}
Add(Label,13318445,252,147)
{
Left=150
Top=5
Width=35
Height=17
Caption="Центр"
}
Add(Label,16251060,259,154)
{
Left=270
Top=5
Width=41
Height=17
Caption="Отклон"
}
Add(Hub,2554239,385,287)
{
link(onEvent1,9928803:doMin,[])
link(onEvent2,9928803:doMax,[])
}
Add(Math,10120666,378,189)
{
OpType=1
Default=99.5
link(onResult,10057108:doOperation,[])
link(Op1,10356950:Var2,[])
link(Op2,15452987:Var1,[(391,173)])
}
Add(Math,10057108,420,189)
{
Default=100.5
link(onResult,2554239:doEvent1,[(459,195)(459,314)(375,314)(375,293)])
link(Op1,10356950:Var3,[(426,166)])
link(Op2,15452987:Var2,[])
}
Add(GetDataEx,10356950,378,161)
{
link(Data,880931:Value,[])
}
Add(GetDataEx,15452987,427,168)
{
link(Data,11100228:Text,[])
}
Add(Plotter,906974,588,126)
{
Left=5
Top=265
Width=375
Height=235
Name="MyNorm"
}
Add(PlotLines,3117872,665,343)
{
Grapher="MyNorm"
MaxValues=601
link(ValueX,4799661:Index,[(678,334)(657,334)(657,383)(615,383)])
}
Add(ArrayEnum,4799661,602,343)
{
link(onItem,3117872:doAdd,[])
link(Array,9505819:Var1,[(608,257)])
}
Add(Hub,1939,483,126)
{
link(onEvent1,906974:doClear,[])
link(onEvent2,12460140:doClear,[])
}
Add(MathParse,15349590,511,273)
{
DataCount=1
MathStr="(%1-100)*100 + 300"
ResultType=0
link(onResult,4853324:doRead,[])
}
Add(For,6361862,574,210)
{
End=600
link(onEvent,4972326:doData,[])
}
Add(StrList,4494096,672,196)
{
}
Add(Hub,9616262,539,217)
{
link(onEvent1,4494096:doClear,[(571,223)(571,251)(662,251)(662,209)])
link(onEvent2,6361862:doFor,[(564,230)(564,216)])
}
Add(DoData,4972326,616,210)
{
Data=Integer(0)
link(onEventData,4494096:doAdd,[(655,216)(655,202)])
}
Add(ArrayRW,4853324,686,273)
{
link(onRead,5328718:doOperation,[])
link(Array,9505819:Var2,[])
link(Index,15349590:Result,[(699,264)(678,264)(678,313)(517,313)])
link(Value,5328718:Result,[(706,264)(727,264)(727,313)(741,313)])
}
Add(Math,5328718,735,273)
{
Op2=1
ResultType=0
link(onResult,4853324:doWrite,[(774,279)(774,321)(669,321)(669,286)])
}
Add(GetDataEx,9505819,686,252)
{
link(Data,4494096:Array,[])
}
Add(InfoTip,3810032,336,63)
{
Info=#18:Среднее значение +|10:Отклонение|
Font=[MS Sans Serif,10,1,255,1]
Width=134
Height=165
}
Add(Memory,880931,378,119)
{
Default=Real(100)
}
карма: 19

0
Ответов: 2059
Рейтинг: 132
#8: 2016-10-17 13:46:33 ЛС | профиль | цитата
Леонид, спасибо!
Уже разобрался.
Всё заработало!
https://yadi.sk/i/Y0ccx3luwzJVk
https://yadi.sk/i/YAXEu_8ZwzJUj
Ещё раз спасибо!

P.S.
А вот несколько иной подход https://habrahabr.ru/post/275727/

Редактировалось 1 раз(а), последний 2016-10-17 14:16:18
карма: 6

0
8
Сообщение
...
Прикрепленные файлы
(файлы не залиты)