Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 901

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Подскажите пожалуйста, как написать код для суммы N чисел распределенных по нормальному закону распределения и использование Ttimer. Функцию нормального распределения я знаю. Надо чтобы числа прибавлялись по мере их появления к общей сумме чисел. Tj=Tj-1+m, где Tj-1-предыдущая сумма; Tj-следующая сумма; m-случайное число; причем в начальный момент Tj-1=0.

Александр86 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Александр86 (статус: Посетитель)
Вопрос отправлен: 19 марта 2010, 22:33
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 14; последнее сообщение — 19 марта 2010, 23:43; участников в обсуждении: 2.
min@y™

min@y™ (статус: Доктор наук), 19 марта 2010, 22:40 [#1]:

Не пойму, в чём проблема?
Есть событие таймера TTimer.OnTimer, повесь на него обработчик и суммируй.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

19 марта 2010, 22:46: Вопрос перемещён из тематического раздела Delphi » Алгоритмы, преобразования в раздел Лабораторный практикум » Delphi модератором min@y™ Причина: Явная лаба

Александр86

Александр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™

min@y™ (статус: Доктор наук), 19 марта 2010, 22:52 [#3]:

Ну и в чём же проблема-то?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Александр86

Александр86 (статус: Посетитель), 19 марта 2010, 22:57 [#4]:

Я не могу разобраться Как найти сумму Этих случ. чисел x?
min@y™

min@y™ (статус: Доктор наук), 19 марта 2010, 22:57 [#5]:

Для начала выкинь Randomize() из функции Gauss().
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 19 марта 2010, 22:58 [#6]:

Цитата (Александр86):

Я не могу разобраться Как найти сумму Этих случ. чисел x?

Заведи глобальную переменную или поле формы и храни сумму в ней.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Александр86

Александр86 (статус: Посетитель), 19 марта 2010, 23:02 [#7]:

Извините я забыл сказать, что после каждого суммирования с новым случ. числом сумма проверяется на определенное условие заданное мной.
min@y™

min@y™ (статус: Доктор наук), 19 марта 2010, 23:07 [#8]:

Цитата (Александр86):

сумма проверяется на определенное условие заданное мной.

Опять не могу понять, в чём проблема? Не знаешь оператор if ... then ... else ?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Александр86

Александр86 (статус: Посетитель), 19 марта 2010, 23:12 [#9]:

Я Знаю операторы If .... это пояснение для полной картины. Подскажите пожалуйста как сделать для моего случая Глобальную переменную, просто я не силенн в них, хотя бы примерно.
min@y™

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™

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

Александр86 (статус: Посетитель), 19 марта 2010, 23:29 [#12]:

Спасибо за рекомендации. Буду иметь в виду.
Можно еще один последний вопросик, А как (Sum) использовать правильно при суммирование.
min@y™

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

Александр86 (статус: Посетитель), 19 марта 2010, 23:43 [#14]:

Огромное вам спасибо, все работает.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:58
Выполнено за 0.03 сек.