![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Траблка с Radnomiza [D6]
Windows © (2006-12-24 21:12:00)Здравствуйте уважаемые...
ничего не понимаю...
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;
если вызвать функцию допустим три раз подряд, то всегда одинаковый символ возвращается...
MBo (2006-12-25 15:41:00) [1]>Loginov Dmitry © (25.12.06 15:08) [17]
>Это анализ кода или гадание?
навеяно вот этим:
procedure TForm1. Button1Click
Loginov Dmitry (2006-12-25 15:08:00) [2]> Потому что ты вызываешь нажатием на кнопку, и проходит достаточно
> времени
Это анализ кода или гадание?
Германн (2006-12-25 14:42:00) [3]
> Windows © (25.12.06 14:37) [15]
>
> не, второй код...
> вот когда я вчера так делал, он мне всегда возвращал одно
> и то же...
> а сегодня уже разные...
>
Вчера было восресенье. Нерабочий день :-)
Windows (2006-12-25 14:37:00) [4]не, второй код...
вот когда я вчера так делал, он мне всегда возвращал одно и то же...
а сегодня уже разные...
Anatoly Podgoretsky (2006-12-25 14:04:00) [5]Такого быть не может, а про какой код ты говоришь, ты привел два разных, у тебя обеи стали работать? Не верю.
Windows (2006-12-25 13:42:00) [6]А вот теперь не знаю как понимать, я ничего в коде не менял, а сейчас вдруг заработало... Почему такое может быть!?
MBo (2006-12-25 08:44:00) [7]>В полученном списке числа далеко не одни и те же.
Потому что ты вызываешь нажатием на кнопку, и проходит достаточно времени. А если сделаешь отдельную процедуру и несколько раз подряд ее вызовешь программно, то с большой долей верочтности будут повторы
Loginov Dmitry (2006-12-25 07:57:00) [8]Однако:
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;
В полученном списке числа далеко не одни и те же.
ors_archangel (2006-12-25 04:14:00) [9]
> Германн © (25.12.06 02:39) [9]
Наверно, ты прав. Исправлюсь:
Если конкретней, то
procedureRandomize;
{$IFDEF LINUX}
begin
RandSeed := _time(nil);
end;
{$ENDIF}
{$IFDEF MSWINDOWS}
var
Counter: Int64;
begin
ifQueryPerformanceCounter(Counter) then
RandSeed := Counter
else
RandSeed := GetTickCount;
end;
{$ENDIF}
- не знаю, как QueryPerfomanceCounter, но GetTickCount меняется только раз в миллисикунду, т.е. 1000 раз/сек, получаем что если проц = 1 GHz, то значение RandSeed не будет меняться (т.к. будет инициироваться после Randomazа одним и тем же значением) примерно 1 000 0000 / колво_тактов_на_итерацию_цикла (которое в данном случа не слишком большое), а так как Random - это что-то ворде
functionRandom: 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
Германн (2006-12-25 02:39:00) [10]
> 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 01:54:00) [11]
> Windows © (24.12.06 21:12)
Randomize устанавливает RandSeed в зависимости от текущего времени, поэтому если ты перед Random (наприер, в цикле) вызывешь Randomize, то получаешь как раз совсем не Random, потому что RandSeed постоянно "сбрасывается"
Kostafey (2006-12-25 01:19:00) [12]
...
> Begin
> Randomize; - эту строку удалить
> i := random(25);
...
Kostafey (2006-12-25 01:15:00) [13]> [4] Windows © (25.12.06 00:57)
Гм. попробуй рассматривать randomize как инициализатор последовательности случайных чисел например:
randomize;
a:=CaseLetter;
b:=CaseLetter;
c:=CaseLetter;
Германн (2006-12-25 01:04:00) [14]
> Windows © (25.12.06 00:57) [4]
>
> В том-то и дело, что ничего не работает никак...
> пишу к примеру так
> randomize;
> a:=CaseLetter;
> randomize;
> b:=CaseLetter;
> randomize;
> c:=CaseLetter;
> и всегда одно и то же!
см. [2]
...
> before allcalls to Random
...
Windows (2006-12-25 00:57:00) [15]В том-то и дело, что ничего не работает никак...
пишу к примеру так
randomize;
a:=CaseLetter;
randomize;
b:=CaseLetter;
randomize;
c:=CaseLetter;
и всегда одно и то же!
Loginov Dmitry (2006-12-25 00:10:00) [16]> если вызвать функцию допустим три раз подряд, то всегда
> одинаковый символ возвращается
нагло жжешь!
Eraser (2006-12-24 21:15:00) [17]> [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.
Anatoly Podgoretsky (2006-12-24 21:14:00) [18]> Windows (24.12.2006 21:12:00) [0]
Randomize; вынеси из функции