Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];

Вниз

Траблка с Radnomiza   Найти похожие ветки 

 
Windows ©   (2006-12-24 21:12) [0]

Здравствуйте уважаемые...
ничего не понимаю...
 function CaseLetter: string;
   var
     i: integer;
 Begin
   Randomize;
   i := random(25);
   case i of
     0: Result := "a";   9: Result := "j";  18: Result := "s";
     1: Result := "b";  10: Result := "k";  19: Result := "t";
     2: Result := "c";  11: Result := "l";  20: Result := "u";
     3: Result := "d";  12: Result := "m";  21: Result := "v";
     4: Result := "e";  13: Result := "n";  22: Result := "w";
     5: Result := "f";  14: Result := "o";  23: Result := "x";
     6: Result := "g";  15: Result := "p";  24: Result := "y";
     7: Result := "h";  16: Result := "q";  25: Result := "z";
     8: Result := "i";  17: Result := "r";
   end;
 End;

если вызвать функцию допустим три раз подряд, то всегда одинаковый символ возвращается...


 
Anatoly Podgoretsky ©   (2006-12-24 21:14) [1]

> Windows  (24.12.2006 21:12:00)  [0]

Randomize; вынеси из функции


 
Eraser ©   (2006-12-24 21:15) [2]

> [0] Windows ©   (24.12.06 21:12)

справку читать будем?
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.


 
Loginov Dmitry ©   (2006-12-25 00:10) [3]

> если вызвать функцию допустим три раз подряд, то всегда
> одинаковый символ возвращается


нагло жжешь!


 
Windows ©   (2006-12-25 00:57) [4]

В том-то и дело, что ничего не работает никак...
пишу к примеру так
randomize;
a:=CaseLetter;
randomize;
b:=CaseLetter;
randomize;
c:=CaseLetter;
и всегда одно и то же!


 
Германн ©   (2006-12-25 01:04) [5]


> Windows ©   (25.12.06 00:57) [4]
>
> В том-то и дело, что ничего не работает никак...
> пишу к примеру так
> randomize;
> a:=CaseLetter;
> randomize;
> b:=CaseLetter;
> randomize;
> c:=CaseLetter;
> и всегда одно и то же!

см. [2]
...
> before all calls to Random
...


 
Kostafey ©   (2006-12-25 01:15) [6]

> [4] Windows ©   (25.12.06 00:57)

Гм. попробуй рассматривать randomize как инициализатор последовательности случайных чисел например:

randomize;
a:=CaseLetter;
b:=CaseLetter;
c:=CaseLetter;


 
Kostafey ©   (2006-12-25 01:19) [7]


...
> Begin
>   Randomize; - эту строку удалить
>   i := random(25);

...


 
ors_archangel ©   (2006-12-25 01:54) [8]


> Windows ©   (24.12.06 21:12) 

Randomize устанавливает RandSeed в зависимости от текущего времени, поэтому если ты перед Random (наприер, в цикле) вызывешь Randomize, то получаешь как раз совсем не Random, потому что RandSeed постоянно "сбрасывается"


 
Германн ©   (2006-12-25 02:39) [9]


> ors_archangel ©   (25.12.06 01:54) [8]
>
>
> > Windows ©   (24.12.06 21:12)
>
> Randomize устанавливает RandSeed в зависимости от текущего
> времени, поэтому если ты перед Random (наприер, в цикле)
> вызывешь Randomize, то получаешь как раз совсем не Random,
>  потому что RandSeed постоянно "сбрасывается"
>

Не знаю почему, но у меня сей пост вызывает раздражение. Он-то где-то как-то правильный, но для "Начинающих" слишком неопределённый. Имхо.


 
ors_archangel ©   (2006-12-25 04:14) [10]


> Германн ©   (25.12.06 02:39) [9]

Наверно, ты прав. Исправлюсь:
Если конкретней, то

procedure Randomize;
{$IFDEF LINUX}
begin
 RandSeed := _time(nil);
end;
{$ENDIF}
{$IFDEF MSWINDOWS}
var
 Counter: Int64;
begin
 if QueryPerformanceCounter(Counter) then
   RandSeed := Counter
 else
   RandSeed := GetTickCount;
end;
{$ENDIF}

- не знаю, как QueryPerfomanceCounter, но GetTickCount меняется только раз в миллисикунду, т.е. 1000 раз/сек, получаем что если проц = 1 GHz, то значение RandSeed не будет меняться (т.к. будет инициироваться после Randomazа одним и тем же значением) примерно 1 000 0000 / колво_тактов_на_итерацию_цикла (которое в данном случа не слишком большое), а так как Random - это что-то ворде

function Random: Extended;
const two2neg32: double = ((1.0/$10000) / $10000);  // 2^-32
asm
{       FUNCTION _RandExt: Extended;    }
       PUSH    EBX
       XOR     EBX, EBX
       IMUL    EDX,[EBX].RandSeed,08088405H
       INC     EDX
       MOV     [EBX].RandSeed,EDX
       FLD     [EBX].two2neg32
       PUSH    0
       PUSH    EDX
       FILD    qword ptr [ESP]
       ADD     ESP,8
       FMULP   ST(1), ST(0)
       POP     EBX
end;

т.е. мы умножаем RandSeed, затем добавляем к нему 1, сохраняем его новое значение, затем умножаем его ещё на константу… т.е. Random - это реккурентная функция, но начальный аргумент = RandSeed (который является глобальной переменной) и когда мы "сбрасываем" RandSeed (вызываем Randomize через очень малые промежутки времени, например в цикле с малым телом), то и Random получаем одинаковый, - даже хуже, мы получаем одинаковые последовательности Random на всю итерацию цикла, т.к. эти последовательности зависят только от начального значения RandSeed


 
Loginov Dmitry ©   (2006-12-25 07:57) [11]

Однако:


procedure TForm1.Button1Click(Sender: TObject);
var
 List: TStringList;
 I: Integer;
begin
 List := TStringList.Create;
 for I := 1 to 30 do
 begin
   Randomize;
   List.Add(IntToStr(Random(1000)));
 end;

 ShowMessage(List.Text);

 List.Free;
end;


В полученном списке числа далеко не одни и те же.


 
MBo ©   (2006-12-25 08:44) [12]

>В полученном списке числа далеко не одни и те же.
Потому что ты вызываешь нажатием на кнопку, и проходит достаточно времени. А если сделаешь отдельную процедуру и несколько раз подряд ее вызовешь программно, то с большой долей верочтности будут повторы


 
Windows ©   (2006-12-25 13:42) [13]

А вот теперь не знаю как понимать, я ничего в коде не менял, а сейчас вдруг заработало... Почему такое может быть!?


 
Anatoly Podgoretsky ©   (2006-12-25 14:04) [14]

Такого быть не может, а про какой код ты говоришь, ты привел два разных, у тебя обеи стали работать? Не верю.


 
Windows ©   (2006-12-25 14:37) [15]

не, второй код...
вот когда я вчера так делал, он мне всегда возвращал одно и то же...
а сегодня уже разные...


 
Германн ©   (2006-12-25 14:42) [16]


> Windows ©   (25.12.06 14:37) [15]
>
> не, второй код...
> вот когда я вчера так делал, он мне всегда возвращал одно
> и то же...
> а сегодня уже разные...
>

Вчера было восресенье. Нерабочий день :-)


 
Loginov Dmitry ©   (2006-12-25 15:08) [17]

> Потому что ты вызываешь нажатием на кнопку, и проходит достаточно
> времени


Это анализ кода или гадание?


 
MBo ©   (2006-12-25 15:41) [18]

>Loginov Dmitry ©   (25.12.06 15:08) [17]
>Это анализ кода или гадание?

навеяно вот этим:
procedure TForm1.Button1Click



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.013 c
6-1155734845
VolanD666
2006-08-16 17:27
2007.01.14
Asynchronous socket error 10061


2-1166689691
Draught
2006-12-21 11:28
2007.01.14
Два знака после запятой QReport


15-1166877481
КВАНТ
2006-12-23 15:38
2007.01.14
Helpы про WinAPI


2-1166954539
sportman
2006-12-24 13:02
2007.01.14
Еще раз командная строка!!!


11-1143315416
Godness
2006-03-25 22:36
2007.01.14
Как избавится от мерцация формы при добавлении строк в Memo?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский