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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2008, 17:22   #1
IDDQD
 
Аватар для IDDQD
 
Регистрация: 12.01.2008
Сообщений: 3
Восклицание Помогите пожалуйста с оператором Random

Начал обучение языку Delphi по книге Валерия Фаронова - "Система программирования Delphi" ,ну и поскольку человек я усидчивый, хочу разбираться в каждой мелочи,возник вопрос, который не могу решить своими силами, поэтому обращаюсь к знатокам на этом форуме, помогите пожалуйста.

Суть проблемы
Есть самая простенькая программка-игра "Угадай число", программа случайным образом выбирает число в диапазое от 0 до 1000,запоминает его и потом пользователь пытается его угадать. Вообщем то во всём разобрался и программка компилируется и запускается - НО почему то ВСЕГДА программа выбирает число 0.

Ниже представляю листинг программы:

Код:
unit Unit1;

interface

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

type
  TfmExample = class(TForm)
    Panel1: TPanel;
    bbRun: TBitBtn;
    bbClose: TBitBtn;
    edInput: TMaskEdit;
    lbOutput: TLabel;
    mmOutput: TMemo;
    procedure FormActivate(Sender: TObject);
    procedure bbRunClick(Sender: TObject);
  private
    { Private declarations }
     X : Integer;
  public
    { Public declarations }

end;

var
  fmExample: TfmExample;

implementation

{$R *.dfm}


procedure TfmExample.FormActivate(Sender: TObject);
begin
X := Random(1001);   //Предполагаю что тут загвоздка.
edInput.SetFocus;
Caption := 'Угадайте целое число в диапазоне от 0...1000';
lbOutput.Caption := 'Введите число:';
end;

procedure TfmExample.bbRunClick(Sender: TObject);
var
Y : Integer;
begin
if edInput.Text = '' then
Exit;
Y := StrToInt (Trim(edInput.Text));
edInput.Text := '';
edInput.SetFocus;
if Tag = 0 then
if X < Y then
mmOutput.Lines.Add ('X < '+IntToStr(Y))
else if X > Y then
mmOutput.Lines.Add ('X > '+IntToStr(Y))
else
begin
mmOutput.Lines.Add ('X = '+IntToStr(Y));
MessageBeep(MB_OK);
lbOutput.Caption := 'ВЫ УГАДАЛИ,ВВЕДИТЕ 1, ЕСЛИ ХОТИТЕ ПОВТОРИТЬ:';
Tag :=1;
end
else
if Y = 1 then
begin
X := Random (1001);
lbOutput.Caption := 'Введите число:';
Tag :=0;
edInput.SetFocus
end else
Close;
end;

end.

Повторю,что всё работает,но почему то программа постоянно загадывает только 0! Почитал в справке Delphi про Random, там всё написанно так,как я и делаю.
Работаю в среде Delphi 7, под Windows Vista, возможно это из за проблем совместимости? Хотя все другие программы что я компилировал и писал (их пока не много) работают нормально.

Заранее благодарю за ответ.

Последний раз редактировалось IDDQD; 12.01.2008 в 17:25.
IDDQD вне форума Ответить с цитированием
Старый 12.01.2008, 17:26   #2
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
begin
X := Random(1001); //Предполагаю что тут загвоздка.
Вставьте между этими строчками Randomize; это процедура, которая генерирует случайные числа.
puporev вне форума Ответить с цитированием
Старый 12.01.2008, 17:37   #3
IDDQD
 
Аватар для IDDQD
 
Регистрация: 12.01.2008
Сообщений: 3
По умолчанию

По книге этого не было в тексте программы.
В Help`e читал об этой процедуре,но понял что это неcколько другое, она генерирует случайные числа на основе системного таймера, а та что представлена в этой программе,просто псевдослучайные числа,дак вот мне интересное почему она это НЕ делает и постоянно выбирает 0?

При помощи вашего варианта,все заработало нормально, но непонятно почему не работает Random.

Последний раз редактировалось IDDQD; 12.01.2008 в 17:52.
IDDQD вне форума Ответить с цитированием
Старый 12.01.2008, 18:53   #4
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Random генерирует псевдослучайные числа, используя переменную RandSeed, которая изменяется по некоторому алгоритму при каждом вызове Random.
Randomize изменяет RandSeed, используя системный таймер.
Таким образом, можно либо генерировать числа на основе таймера, т.е. перед каждым Random вызывать Randomize, либо генерировать псевдослучайные числа, инициализировав 1 раз RandSeed с помощью Randomize. Обычно используется 2-й метод, т.е. случайные числа получаются с помощью Random, а Randomize вызывается 1 раз в начале программы (например, в разделе initialization модуля или по событию OnCreate формы).
Somebody вне форума Ответить с цитированием
Старый 12.01.2008, 18:54   #5
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

http://www.delphibasics.ru/Randomize.php
http://www.delphibasics.ru/Random.php
Почитай...

Цитата:
Delphi использует генератор псевдослучайных чисел, который, каждый раз, при выполнении программы возвращает одну и ту же последовательность значений (232).

Чтобы избегать этой предсказуемости, используйте процедуру Randomize. Она в качестве начального псевдослучайного значения устанавливает текущее время.
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 12.01.2008, 19:38   #6
IDDQD
 
Аватар для IDDQD
 
Регистрация: 12.01.2008
Сообщений: 3
По умолчанию

Всем спасибо, разобрался.
IDDQD вне форума Ответить с цитированием
Старый 13.01.2008, 20:37   #7
Лубышев
Участник клуба
 
Аватар для Лубышев
 
Регистрация: 23.07.2007
Сообщений: 1,054
По умолчанию

просто перед random нужно пользоваться randomize - функция выдает каждый раз новое число. Random - без randomize выдаст каждый раз одно и тоже число. В книге это обьесняется примерно так: Это нужно для нахождения ошибок в программе. После отработки всей программы, нужно выше функции Random написать randomize
Писано по д'Эльфийски
Лубышев вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Random Febreze Общие вопросы Delphi 2 28.04.2008 14:17
как оператором insert вставить данные сразу в две таблицы? furstenberg БД в Delphi 2 18.10.2007 16:39
Джентльмены, помогите, пжлст. каким оператором высчитать корень 5-ой степени числа? Osi@ Помощь студентам 32 03.10.2007 19:52
Помогите пожалуйста!!! С использованием функции Random сформировать одномерный массив Vanya_www_333 Помощь студентам 1 17.08.2007 13:38