|
Вопрос # 3 901/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Подскажите пожалуйста, как написать код для суммы N чисел распределенных по нормальному закону распределения и использование Ttimer. Функцию нормального распределения я знаю. Надо чтобы числа прибавлялись по мере их появления к общей сумме чисел. Tj=Tj-1+m, где Tj-1-предыдущая сумма; Tj-следующая сумма; m-случайное число; причем в начальный момент Tj-1=0.
 |
Вопрос задал: Александр86 (статус: Посетитель)
Вопрос отправлен: 19 марта 2010, 22:33
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 14; последнее сообщение — 19 марта 2010, 23:43; участников в обсуждении: 2.
|
min@y™ (статус: Доктор наук), 19 марта 2010, 22:40 [#1]:
Не пойму, в чём проблема?
Есть событие таймера TTimer.OnTimer, повесь на него обработчик и суммируй.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
19 марта 2010, 22:46: Вопрос перемещён из тематического раздела Delphi » Алгоритмы, преобразования в раздел Лабораторный практикум » Delphi модератором min@y™ Причина: Явная лаба
|
Александр86 (статус: Посетитель), 19 марта 2010, 22:49 [#2]:
Генератор выдает друг за другом сл. числа и их мне надо суммировать по порядку друг за другом X=x1+x2+...xn. Обработчик Ttimer-событие появления чисел друг за другом я уже применил.
function Gauss(Mx, Sigma: Extended): Extended;
var
a, b, r, Sq: Extended;
begin
Randomize;
repeat
a := 2 * Random - 1;
b := 2 * Random - 1;
r := Sqr(a) + Sqr(b);
until r < 1;
Sq := Sqrt(-2 * Ln(r) / r);
Result := Mx + Sigma * a * Sq;
end;
// Таймер запускается
procedure TForm1.Timer1Timer(Sender: TObject);
var
x:real;
m:real;
q:real;
begin
m:=StrToFloat(Edit1.Text);
q:=StrToFloat(Edit2.Text);
repeat
x := Gauss(m,q);
until x>-0.5;
label3.Caption:=' '+FloatToStr(Abs(Round(x)));
end;
|
|
min@y™ (статус: Доктор наук), 19 марта 2010, 22:52 [#3]:
Ну и в чём же проблема-то?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Александр86 (статус: Посетитель), 19 марта 2010, 22:57 [#4]:
Я не могу разобраться Как найти сумму Этих случ. чисел x?
|
|
min@y™ (статус: Доктор наук), 19 марта 2010, 22:57 [#5]:
Для начала выкинь Randomize() из функции Gauss().
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 19 марта 2010, 22:58 [#6]:
Цитата (Александр86):
Я не могу разобраться Как найти сумму Этих случ. чисел x?
Заведи глобальную переменную или поле формы и храни сумму в ней.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Александр86 (статус: Посетитель), 19 марта 2010, 23:02 [#7]:
Извините я забыл сказать, что после каждого суммирования с новым случ. числом сумма проверяется на определенное условие заданное мной.
|
|
min@y™ (статус: Доктор наук), 19 марта 2010, 23:07 [#8]:
Цитата (Александр86):
сумма проверяется на определенное условие заданное мной.
Опять не могу понять, в чём проблема? Не знаешь оператор if ... then ... else ?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Александр86 (статус: Посетитель), 19 марта 2010, 23:12 [#9]:
Я Знаю операторы If .... это пояснение для полной картины. Подскажите пожалуйста как сделать для моего случая Глобальную переменную, просто я не силенн в них, хотя бы примерно.
|
|
min@y™ (статус: Доктор наук), 19 марта 2010, 23:19 [#10]:
function Gauss(Mx, Sigma: Extended): Extended;
var
a, b, r, Sq: Extended;
begin
Randomize(); // <--- выкинуть однозначно
repeat
a := 2 * Random - 1; // -1 <= a < +1
b := 2 * Random - 1; // -1 <= b < +1
r := Sqr(a) + Sqr(b); // 0 <= r < 2
until r < 1;
Sq := Sqrt(-2 * Ln(r) / r); // здесь возможно деление на 0
Result := Mx + Sigma * a * Sq;
end;
// Таймер запускается
procedure TForm1.Timer1Timer(Sender: TObject);
var
x, m, q :real; // Не называй так переменные. Их имена должны нести информацию об их назначении.
begin
m:= StrToFloat(Edit1.Text); // Зачем каждый раз вычислять одно и то же?
q:= StrToFloat(Edit2.Text); // Зачем каждый раз вычислять одно и то же?
repeat
x := Gauss(m, q);
until x > -0.5; // лепить циклы с таким условием выхода в обработчике таймера я бы не решился
label3.Caption:= ' ' + FloatToStr(Abs(Round(x))); // Зачем округлять, когда всё равно FloatToStr?
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 19 марта 2010, 23:21 [#11]:
Цитата (Александр86):
Глобальную переменную, просто я не силенн в них, хотя бы примерно.
var
Sum: Extended = 0.0;
function Gauss(Mx, Sigma: Extended): Extended;
begin
// ...
end;
// Таймер запускается
procedure TForm1.Timer1Timer(Sender: TObject);
begin
// ...
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Александр86 (статус: Посетитель), 19 марта 2010, 23:29 [#12]:
Спасибо за рекомендации. Буду иметь в виду.
Можно еще один последний вопросик, А как (Sum) использовать правильно при суммирование.
|
|
min@y™ (статус: Доктор наук), 19 марта 2010, 23:37 [#13]:
Цитата (Александр86):
А как (Sum) использовать правильно при суммирование.
Ну ты ваще...
// Таймер запускается
procedure TForm1.Timer1Timer(Sender: TObject);
var
x, m, q :real; // Не называй так переменные. Их имена должны нести информацию об их назначении.
begin
m:= StrToFloat(Edit1.Text); // Зачем каждый раз вычислять одно и то же?
q:= StrToFloat(Edit2.Text); // Зачем каждый раз вычислять одно и то же?
repeat
x := Gauss(m, q);
until x > -0.5; // лепить циклы с таким условием выхода в обработчике таймера я бы не решился
Sum:= Sum + x; // <--- Например, вот так.
label3.Caption:= ' ' + FloatToStr(Abs(Round(x))); // Зачем округлять, когда всё равно FloatToStr?
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Александр86 (статус: Посетитель), 19 марта 2010, 23:43 [#14]:
Огромное вам спасибо, все работает.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|