Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.08.2010, 02:51
Аватар для RoboStudent
RoboStudent RoboStudent вне форума
Прохожий
 
Регистрация: 05.08.2010
Адрес: Москва
Сообщения: 16
Репутация: 10
По умолчанию Всегда одинаковые "случайные" фразы

Здравствуйте!
Не могу разобраться с одной странной особенностью:

PHP код:
procedure TForm1.Button1Click(SenderTObject);
const
  
alphabet='abcdefghijklmnopqrstuvwxyz';
var
  
tempstring;
  
i:integer;
begin
  temp
:='';
  for 
i:=1 to 8 do
   
temp:=temp+alphabet[random(length(alphabet)+1)+1];
   
memo1.Lines.Add(temp);
end
Генерируются случайные фразы, вставляются в memo1, но!
Если перезапустить программу и начать генерацию, все фразы
генерируются в том же самом порядке, что и в прошлый запуск
программы.
И еще - программа иногда генерирует не восьмизначные, как задумано,
а и трёх и пятизначные и даже иногда однозначные.

От чего всё это зависит?

Заранее благодарю!
Ответить с цитированием
  #2  
Старый 11.08.2010, 03:56
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,047
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

При старте программы вызови Randomize;
Ответить с цитированием
  #3  
Старый 11.08.2010, 05:03
Аватар для RoboStudent
RoboStudent RoboStudent вне форума
Прохожий
 
Регистрация: 05.08.2010
Адрес: Москва
Сообщения: 16
Репутация: 10
Смех Всё решено

Ага, понял. Спасибо!

Проблему генераций решил так:
PHP код:
procedure TForm1.Button1Click(SenderTObject);
const
 
alphabet='abcdefghijklmnopqrstuvwxyz';
var
 
tempstring;
begin
 temp
:='';
 while 
length(temp)<do
 
begin
  temp
:=temp+alphabet[random(length(alphabet))+1];
 
end;
 
memo1.Lines.Add(temp);
end
Как я понял, его не устраивал периодический 0 в выдаче random. В общем, всё хорошо.

Последний раз редактировалось RoboStudent, 11.08.2010 в 05:15.
Ответить с цитированием
  #4  
Старый 11.08.2010, 08:41
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  FBoundary: String;
begin
  Randomize;
  FBoundary:='';
  while Length(FBoundary)<8 do
    FBoundary:=FBoundary+Chr(Random(26)+97); // Ord('a') = 97
  Memo1.Lines.Add(FBoundary);
end;
Ответить с цитированием
  #5  
Старый 11.08.2010, 10:21
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Вообще-то, чтобы уменьшить шансы на повтор псевдослучайных последовательностей, лучше Randomize поместить где-то в OnCreate формы.
Ответить с цитированием
  #6  
Старый 11.08.2010, 11:22
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от roamer
Вообще-то, чтобы уменьшить шансы на повтор псевдослучайных последовательностей, лучше Randomize поместить где-то в OnCreate формы.
отвечу так:
Код:
procedure       Randomize;
{$IFDEF LINUX}
begin
  RandSeed := _time(nil);
{$ENDIF}
{$IFDEF MSWINDOWS}
var
        systemTime :
        record
                wYear   : Word;
                wMonth  : Word;
                wDayOfWeek      : Word;
                wDay    : Word;
                wHour   : Word;
                wMinute : Word;
                wSecond : Word;
                wMilliSeconds: Word;
                reserved        : array [0..7] of char;
        end;
asm
        LEA     EAX,systemTime
        PUSH    EAX
        CALL    GetSystemTime
        MOVZX   EAX,systemTime.wHour
        IMUL    EAX,60
        ADD     AX,systemTime.wMinute   { sum = hours * 60 + minutes    }
        IMUL    EAX,60
        XOR     EDX,EDX
        MOV     DX,systemTime.wSecond
        ADD     EAX,EDX                 { sum = sum * 60 + seconds              }
        IMUL    EAX,1000
        MOV     DX,systemTime.wMilliSeconds
        ADD     EAX,EDX                 { sum = sum * 1000 + milliseconds       }
        MOV     RandSeed,EAX
{$ENDIF}
end;
Цитата:
Description

Randomize initializes the built-in random number generator with a random value (obtained from the system clock). The random number generator should be initialized by making a call to Randomize, or by assigning a value to RandSeed.

Do not combine the call to Randomize in a loop with calls to the Random function. Typically, Randomize is called only once, before all calls to Random.
про OnCreate рекомендаций нет, так же как и запрета на вызов перед циклом Random'ов
Ответить с цитированием
  #7  
Старый 11.08.2010, 12:11
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Понятно.
А Random ?
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:28.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter