| 
| 
 | Вопрос # 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]:Огромное вам спасибо, все работает. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |