Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
линейный конгруэнтный метод - выработка псевдосл. чисел
 
Serge 007, спасибо за совет, ссылку, но мне нужно именно на ВБА, а не на Делфи.  
 
ZVI, где можно такой мозг как у Вас приобрести?)) Как всегда, на высоте)  
В общем, дело в том, что тема дипломной работы связана с оценкой коэффициентов линейной регрессии в случаях, когда в измеряемых данных имеются погрешности, существование которых неявно. Моделируем псевдослучайные величины с разными законами распределения - данные, по которым оцениваем в дальнейшем коэффициенты уравнения. Желательно подбирать такие данные, которые будут иметь бОльшую "случайность", будут независимы, также существует несколько тестов, по которым оценивается выборка на право называться "хорошей". Я, право, сама не знаю, зачем такие изыски, выборки в общем небольшие 500-1000 значений, да и показатели у rnd неплохие. Но научный руководитель настаивает :(  
 
И еще последний мучительный вопрос, посмотрите, пожалуйста, может для чьего-то мозга это понятно (ZVI, взято по Вашей ссылке).  
алгоритм для стьюпидов. можно ли как-то на ВБА раномерно распределенные на [0,1] знчения получить?
 
program KISS;{Keep It Simple Stupid}  
 
var  
x : LongWord = 123456789;  
y : LongWord = 362436000;  
z : LongWord = 521288629;  
c : LongWord = 7654321;  
 
function KissRandom() : LongWord;  
var  
t : int64;  
begin  
x := int64(69069)*x + 12345;  
y := y xor (y shl 13);  
y := y xor (y shr 17);  
y := y xor (y shl 5);  
t := int64(698769069)*z + c;  
c := t shr 32;  
z := t;  
result := x + y + z;  
end;  
 
begin  
{...}  
end.
линейный конгруэнтный метод - выработка псевдосл. чисел
 
Может кто-нибудь силен в Delphi? Помогите, пожалуйста, перевести алгоритм для работы в ВБА:  
 
program MotherOfAll;  
 
var  
y : array [0..4] of real;
 
procedure InitRandom(seed : LongWord);  
var  
i : integer;  
s : int64;  
begin  
s := seed;  
for i := 0 to 4 do begin  
s := LongWord(s*1664525 + 1013904223);  
y[i] := s/4294967296;
end;  
end;  
 
function MotherOfAllRandom() : real;  
var  
b, c : extended;  
begin  
b := 2111111111.0;  
c := b*y[3] + 1492*y[2] + 1776*y[1] + 5115*y[0] + y[4];
y[4] := trunc©; y[3] := y[2]; y[2] := y[1]; y[1] := y[0]; y[0] := c - y[4];
y[4] := y[4]/4294967296;
result := y[0];
end;  
 
begin  
InitRandom(GetTickCount);//часы простой, но плохой способ инициации  
{...}  
end.  
 
Из теории  
Вычислительная формула:  
S= 2111111111*y[n-4] + 1492*y[n-3] + 1776*y[n-2] + 5115*y[n-1] + C,
x[n]=S/(2^32),
C=[S/(2^32)]
Здесь период имеет порядок 2^250. x[i] принадлежат [0, 1). Начальные их значения могут быть выбраны случайно
линейный конгруэнтный метод - выработка псевдосл. чисел
 
ZVI, спасибоо!!!! Вы в который раз меня выручаете. Вот я дурак, ModBig = CDbl(Evaluate("=MOD(" & Num1 & "," & Num2 & ")"))  думала, что это и есть остаток от деления на Num2  *крутит пальцем у виска*.  
Задача как раз-таки в том состоит, чтобы рассмотреть несколько генераторов псл. в том числе конгруэнтный, mother of all, метод фибоначчи с запаздываниями и т.д.    
Эммм..выходит, используя все эти методы, для получения равномерно распределенных чисел на [0, 1] нужно всегда на m делить? M=2^16, M=2^32. Так?
линейный конгруэнтный метод - выработка псевдосл. чисел
 
Ребят, я вас наверное достала уже( Дурак я, дурак..  
 
 
И, нажимая F8, сравните результат в окне Immediate.  
Для 3-х проходов по циклу получаем:  
1 0,256935039069504    
2 1103527590    
1 0,587870657444    
2 2015    
1 0,718314896337688    
2 3085138988    
 
где значения под индексом 1 - для (a1*ran(l)+c)/m - WorksheetFunction.Floor(((a1*ran(l)+c)/m),1)  
а под индексом 2 - для 2, ModBig(a1 * ran(l) + c, m)  
 
Но ведь должны получаться как раз-таки значения, равномерно распределенные на [0,1]? А в методе под индексом 2 почему такие огромные числа? Там ведь остаток от деления?
линейный конгруэнтный метод - выработка псевдосл. чисел
 
ZVI, выражаю Вам огромную благодарность! ++++++
линейный конгруэнтный метод - выработка псевдосл. чисел
 
Dophin, Вы до этой формулы сами дошли? Может быть, на книгу какую опирались? Ткните мне, пожалуйста, где об этом можно прочитать )  
Спасибо.
линейный конгруэнтный метод - выработка псевдосл. чисел
 
Dophin, VovaK спасибо!  
Dophin, действительно, в mod загвоздка, осталось ее найти :)  
С Вашей формулой работает, разбираю, как Вы это сделали :)
линейный конгруэнтный метод - выработка псевдосл. чисел
 
Уважаемые форумчане, здравствуйте! Помогите, пожалуйста, разобраться, почему при реализации линейного конгруэнтного метода выдается ошибка Run-time error '6' overflow - empty - пустое выражение (0). Прим. смотреть макрос :)  
Спасибо!
Страницы: 1
Loading...