Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2013, 22:51   #1
Оль4ик
Пользователь
 
Аватар для Оль4ик
 
Регистрация: 26.06.2012
Сообщений: 39
По умолчанию Генерирование вещественных чисел

Здравствуйте! Пишу программу Генератор случайных вещественных чисел (от 0 до 1) Методом Середины Квадратов.
Есть некоторые затруднения при написании данной программы.
Код работает, но крайне нестабильно!!! Если в цикле for число N заменить на "3", то она ещё как-то работает (через раз), а если число циклов будет более "10", то уже не работает!
Поясню как должны получаться числа Методом Середины Квадратов.
Вот есть число х0, полученное Random-ом, допустим 0,32932786074033. Моя задача - сгенерировать 200 вещ. чисел приведенным ниже методом.
Для создания всех последующих элементов существует особое требование:
- отбрасывается нуль от этого Random-ного числа, затем оно обрезается справа до 8 цифр, полученное число возводится в квадрат.
- при этом получается 16-ти-значное число, которое необходимо также укоротить – обрезать по четыре цифры с обеих сторон, в результате чего оно опять получается 8-ми-значным, которое я «превращу» в вещественное, присоединив к нему слева нуль с запятой. И т.д. пока не получим 200 элементов.
Подскажите, как сделать чтобы прога не глючила ?

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Memo1: TMemo;
    Edit4: TEdit;
    Label4: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
    const
      N = 200; // Количество генерируемых чисел
var
  Form1: TForm1;
  //chisla: array [1..N] of Extended;
   //случайное число от 0 до 1
implementation
{$R *.dfm}
uses Math;
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
stroka:string;
S1,S2:string;
x1:real;
x0: Extended;
x01:Extended;
x02:int64;
x:int64;
  begin
    Randomize; //Запускаем генератор случ. чисел
    for i:=1 to 3 do
    begin

      x0:= Random;
      Edit1.text:= floattostr(x0);     // Контролируем появление числа
      x01:=((x0*100000000));           // Избавляемся от нуля слева

      S1:= Copy(floattostr(x01),1,8);  // И урезаем число до 8 цифр
      x:= strtoint(S1); // Переприсваиваем значение промежуточной переменной
      x02:= x*x;         // Возводим в квадрат
      Edit2.Text:= inttostr(x02);      // Выводим 16-ти знач. число
      S2:= Copy((Edit2.Text),5,8);  // Подрезаем 16-ти знач. число до 8-ми знач.
      Edit3.Text:= S2; // Переприсваиваем значение промежуточной переменной
      x1:= strtoint(Edit3.Text)/100000000; //Получаем новое число от 0 до 1
      Edit4.Text:= floattostr(x1); //Выводим его на экран

      Memo1.Lines.Add(FloatToStr(x1));

   end;

ShowMessage('x0= '+FloatToStr(x0)+#13+'x01= '+FloatToStr(x01)+ #13 +'x02= '+FloatToStr(x02));

  end;
end.
Вложения
Тип файла: rar Лаба 2.rar (239.9 Кб, 10 просмотров)
Оль4ик вне форума Ответить с цитированием
Старый 19.03.2013, 09:26   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,544
По умолчанию

Цитата:
Вот есть число х0, полученное Random-ом, допустим 0,32932786074033
а теперь есть число 0,0032932786074033 (floattostr выдает число именно в таком виде)
x01:=00329327,86074033
но первых нулей-то ведь нет.
после урезания имеем 329327,8607
а это вовсе не целое число.
inttostr(x02); не сработает =>программа работает не стабильно!
Код:
x0:=random;
x:=trunc(x0*100000000); // trunc - целая часть от указанного числа
другой способ (хотя в этом способе я не уверен как будет работать floattostr )
Код:
x0:=random +1; // теперь у нас 1,0032932786074033
s:=floattostr(x0*100000000); // 100329327,86074033 
r:=copy(s,2,8); // берем нужную часть (_)

Цитата:
trunc
fxd
P.S. поправку принимаю.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 19.03.2013 в 09:43.
evg_m вне форума Ответить с цитированием
Старый 19.03.2013, 09:39   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

trunc
fxd
phomm вне форума Ответить с цитированием
Старый 19.03.2013, 21:49   #4
Оль4ик
Пользователь
 
Аватар для Оль4ик
 
Регистрация: 26.06.2012
Сообщений: 39
По умолчанию

Хочу сказать всем ОГРОМНОЕ СПАСИБО!!! Теперь программа работает стабильно!
Всего-то делов - изменила строку x01:=(x0*100000000);
на x01:=trunc(x0*100000000);
Даже стыдно, что не смогла это сама сделать.
Не поняла только что имелось ввиду под этим
Цитата:
trunc
fxd
Ещё прошу совет, как правильно прописать цикл for ... to... чтобы в поле Мемо числа отображались не в один столбец как у меня, а так: 20 строк по 10 чисел в каждой?
Спасибо!
Оль4ик вне форума Ответить с цитированием
Старый 19.03.2013, 22:46   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

fxd это "Fixed", по буржуински - исправленно.
Т.е. предидущим постом она была написана по другому "tranc" например.
Цитата:
Ещё прошу совет
Код:
for i... to do ... begin
 if (i mod 10)=0 then Memo.Lines.Text:=Memo.Lines.Text+IntToStr(число)+' '
 else Memo.Lines.Append('');
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.03.2013, 22:46   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,544
По умолчанию

Цитата:
Не поняла только что имелось ввиду под этим
это была фиксация моей опечатки tranc -> trunc
Цитата:
P.S. поправку принимаю.
Код:
MAXM:=10; столько чисел в строке выводим
m:=0; // здесь будем считать сколько чисел вывели в строке
laststr:=0; //а это будет номер(индекс) текущей(последней) строки в Мemo
for i:=1 to ... ..наш исходный цикл
....
  if m=0 then laststr:=Memo.Lines.Add('');
  s:=memo.lines.Strings[laststr];
  s:=s+'; '+FloatToStr(x1);
  memo.Lines.strings[laststr]:=s;
  m:=(m+1) mod MAXM;
end;
P.S. код from Strilet лаконичнее +1
но
Код:
if (i mod 10)=0 then memo.Lines.append('');  //добавляем строку через каждые десять шагов
//else 
memo.Text:=memoText+';  '+ floattostr(...); //число надо выводить всегда (а не только при mod 10=0| mod  10<>0)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 19.03.2013 в 23:00.
evg_m вне форума Ответить с цитированием
Старый 19.03.2013, 22:58   #7
Оль4ик
Пользователь
 
Аватар для Оль4ик
 
Регистрация: 26.06.2012
Сообщений: 39
По умолчанию

О-ей-ей! Пытаюсь сообразить какой из этих способов внедрить. Если правильно поняла это:
Цитата:
P.S. код from Strilet лаконичнее +1
, то от Stilet.
Усиленно соображаю.
Оль4ик вне форума Ответить с цитированием
Старый 19.03.2013, 23:12   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
+1
Пожалуй в случае с первой строкой в мемо могут быть проблемы...
Цитата:
Пытаюсь сообразить какой из этих способов внедрить
Не стесняйся - проверь на практике.
Только в моем случае цикл начни с единицы а не с нуля.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.03.2013, 23:20   #9
Оль4ик
Пользователь
 
Аватар для Оль4ик
 
Регистрация: 26.06.2012
Сообщений: 39
По умолчанию

Своими действиями я кажется свела с ума свою программу. Всё завертелось, закрутилось, но пока не так как надо. Пока что бьюсь...

Не судите меня строго, но получилось пока только так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
stroka:string;
S1,S2:string;
x1:real;
x0: Extended;
x01:Extended;
x02:int64;
x:int64;
m,MAXM,laststr: integer;
  begin
    Memo1.Lines.Add('Сгенерированный массив:');
    Randomize; //Запускаем генератор случ. чисел
    MAXM:=10; //столько чисел в строке выводим
  m:=0; // здесь будем считать сколько чисел вывели в строке
laststr:=0; //а это будет номер(индекс) текущей(последней) строки в Мemo

    for i:=1 to N do
    begin
      x0:= Random;
      Edit1.text:= floattostr(x0);     // Контролируем появление числа
      x01:=trunc(x0*100000000);        // Избавляемся от нуля слева
      S1:= Copy(floattostr(x01),1,8);  // И урезаем число до 8 цифр
      x:= strtoint(S1);           // Переприсваиваем значение промежуточной переменной
      x02:= x*x;                  // Возводим в квадрат
      Edit2.Text:= inttostr(x02);    // Выводим 16-ти знач. число
      S2:= Copy(inttostr(x02),5,8);  // Подрезаем 16-ти знач. число до 8-ми знач.
      Edit3.Text:= S2;              // Показываем вырезку
      x1:= strtoint(S2)/100000000;  //Получение нового числа от 0 до 1
      Edit4.Text:= floattostr(x1);  //Выводим новое число на экран

  if m=0 then laststr:=Memo1.Lines.Add('');
  s2:=memo1.lines.Strings[laststr];
  s2:=s2+'; '+FloatToStr(x1);
  memo1.Lines.strings[laststr]:=s2;
  m:=(m+1) mod MAXM;
end;
      Memo1.Lines.Add(FloatToStr(x1));
   end;
//ShowMessage('x0= '+FloatToStr(x0)+#13+'x01= '+FloatToStr(x01)+ #13 +'x02= '+FloatToStr(x02));
 // end;
end.
И Showmessagе пришлось отключить, а то прога ругается
Изображения
Тип файла: jpg androm.jpg (364.1 Кб, 113 просмотров)

Последний раз редактировалось Stilet; 20.03.2013 в 00:18.
Оль4ик вне форума Ответить с цитированием
Старый 20.03.2013, 00:20   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но получилось пока только так
Ну в теории неплохо.
1) Может лучше на ListView заменить твое Мемо?
2) Для мемо wordwrap убери и поставь scrolbars в both в свойствах - тогда хоть похоже будет (но лучше первое)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дана последовательность вещественных чисел. каждая пара чисел задает границы отрезка. Найти количество целых чисел на отрезках 'studentka' Помощь студентам 6 30.11.2011 18:35
Дано n вещественных чисел а1, а2,…,аn. Определите число соседств двух чисел разного знака (Паскаль) bambam Помощь студентам 1 29.11.2011 11:36
Дан файл вещественных чисел. Создать файл целых чисел, содержащий номера всех локальных максимумов в порядке возрастания zzz6 Помощь студентам 1 04.07.2011 12:59
генерирование массива случайных чисел Якъ Помощь студентам 3 14.11.2010 11:38
Файл вещественных чисел bullvinkle Общие вопросы C/C++ 1 18.06.2009 01:31