![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
random [D7, 2000, XP, 2003]
antonn (work) © (2008-01-06 16:51:00)Фигня какая то:) На некоторых процессорах random() в цикле возвращает одни и теже значения. Насколько я понял, просто не успевает пересчитать из-за малого времени выполнения (фиг знает, как это объяснить, но слиип(1) возвращает к жизни функцию, но все тормозит с ним). Подскажите быструю функцию для получения случайного числа (интервал 0..1, например, шаг 1/360 - т.е. один градус для окружности), чтобы выдавала для 4-10 элементов более-менее случайные значения.
antonn (work) (2008-01-06 19:34:00) [21]код:
procedure TGFX_effect.SetPointGFX(x,y,ty:integer);
var Cadr:pGFX_effectE; i:integer;
begin
randomize;
for i:=FList.Count-1 downto 0 do begin
Cadr:=pGFX_effectE(FList.Items[i]);
cadr.timer:=0;
cadr.angle:=(random(314)/314)*pi*2;
end;
end;
даже если убрать все классы и вывести обычной функцией - вот этот card.angle всегда одни и теже. Глупо смотрится, когда частицы разлетаются толпой в одну строну. Причем не понять, как я раньше с таким не сталкивался. До этого у меня были селероны 433/1200/2400, пни с НТ и сейчас стоит коре2дуо - нет таких заскоков (на одной и той же скомпилированной программе, ОС - ВинХП). Щас на работе дай думаю покодю - а тут такая попа. Причем сейчас тоже вроде вдухядерник (но на Вин2к - она держит многоядерность?) Е2160, пробывал на интелах 1,8-2,4 без НТ - так же в циклах одни и теже значения.
Я даже пойму, что расчет слишком быстро идет и все такое, но как можно это исправить? Sleep дает слишком ощутиму паузу.
homm (2008-01-06 19:26:00) [22]Кстати, действительно, получается зависимость от процессора :)
homm (2008-01-06 19:20:00) [23]> [23] Loginov Dmitry © (06.01.08 19:10)
> У меня все значения - разные.
У меня в 2006 тоже :)
Отсюда вывод, не полагаемся на наличие счетчика и серсию дельфей, считаем что все же значения одинаковые.
Loginov Dmitry (2008-01-06 19:10:00) [24]> Какая разница, как утвержать? Сначала проверь, код с рандомайзом
> внутри цикла дает одинаковые значения.
У меня все значения - разные.
> Так что либо рандомайз его не использует счетчик, либо все
> же QueryPerformanceCounter дает одинаковый результат.
При выполнении кода
if QueryPerformanceCounter(Counter) then
RandSeed := Counter
RandSeed может теоретически принимать одинаковые результаты (с Атлоном 4600+ - примерно каждые 5 секунд) :)
homm (2008-01-06 19:04:00) [25]> [21] Loginov Dmitry © (06.01.08 18:59)
> Я бы не стал так утверждать.
Какая разница, как утвержать? Сначала проверь, код с рандомайзом внутри цикла дает одинаковые значения. Думаю что на семпронах на АМ2 счетчик установлен, но я все равно получаю одинаковый результат. Так что либо рандомайз его не использует счетчик, либо все же QueryPerformanceCounter дает одинаковый результат.
Loginov Dmitry (2008-01-06 18:59:00) [26]> а я бы нет
> цикл
> for i:= 1 to 20 do begin
> randomize;
> a[i]:= random;
> end;
> примерно то и сделает, тем вероятнее чем быстрей процессор
> (больше тактов за одно и тоже время, от которого рандомайз
> и инициализируется, а рандом будет считать одно и тоже значение...)
>
Я бы не стал так утверждать. Randomize сперва определяет текущее значение счетчика тактов (или чего-то там) процессора. Если счетчик отсутствует, то используется GetTickCount. Однако, если счетчик установлен, то два вызова QueryPerformanceCounter() (на одном процессоре) никак не смогут дать два одинаковых значения.
homm (2008-01-06 18:33:00) [27]> [7] antonn (work) (06.01.08 17:40)
> вызывается перед циклом.
> в принципе если добавить в цикл ничего не меняется%)
я думаю это ключевые слова. Это значит что собственно рандомайз (или аналог) и так стоит гдето в цикле, явно или не явно.
{RASkov} (2008-01-06 18:31:00) [28]> [17] sniknik © (06.01.08 18:29)
> а вообще чего тут обсуждать без кода? все что без кода это
> глюк в 17 строке! аминь.
Во-во... это верно )
{RASkov} (2008-01-06 18:30:00) [29]> [15] sniknik © (06.01.08 18:24)
Это понятно....) Мне не совсем понятно тогда [0] т.е. описываемая там трабла....
При таком раскладе как вообще тогда работают программы на тех процессорах..... которые(цпу) там чего-то не успевают :)
sniknik (2008-01-06 18:29:00) [30]> Я бы, чесно говоря удивился, если бы мне эта функция выдала что-нибудь типа
> (0.5, 0.5, 0.5, 0.5, 0.5, 0.5 ...)
а я бы нет
цикл
for i:= 1 to 20 do begin
randomize;
a[i]:= random;
end;
примерно то и сделает, тем вероятнее чем быстрей процессор (больше тактов за одно и тоже время, от которого рандомайз и инициализируется, а рандом будет считать одно и тоже значение...)
а вообще чего тут обсуждать без кода? все что без кода это глюк в 17 строке! аминь.
{RASkov} (2008-01-06 18:27:00) [31]> [14] Loginov Dmitry © (06.01.08 18:21)
> Тогда какое отношение [1] имеет к вопросу?
Ах.... вон что...) Тогда значит я не правильно понял [0] :( Прошу сорри )
Конечно же я "всю дорогу" имел ввиду именно [12] т.е. даже [13].... Вотъ....
sniknik (2008-01-06 18:24:00) [32]{RASkov}
задавай "рандомсиид" одинаковым числом перед циклом, будет типа вызова рандомайз но с одним значением.
и получиш одинаковые последовательности, сколько бы ни жал на кнопку.
нагляднее будет. хальт не нужен.
Loginov Dmitry (2008-01-06 18:21:00) [33]> Дим, перечитай мои посты или.... вот.... вот такой код все
> объяснит
Хорошо. Тогда какое отношение [1] имеет к вопросу? То, что последовательность, генерируемая Random, при каждом запуске одинаковая - это и так понятно. В вопросе же почему-то на некоторых процессорах random() в цикле возвращает одни и теже значения.
Я бы, чесно говоря удивился, если бы мне эта функция выдала что-нибудь типа
(0.5, 0.5, 0.5, 0.5, 0.5, 0.5 ...)
sniknik (2008-01-06 18:20:00) [34]> Это как? При каждом нажатии на Button1 формируется один и тотже набор чисел? =-O
при каждом новом запуске программы и одинаковом количестве нажатий на кнопку (например по разу), да будет одно и тоже.
т.к. без рандомайза рандом возвращает расчетные значения начиная с одного (дефаултного) значения рандомсиид, рандомайз это значение переинициализирует значением от времени (или тиков, не помню), что дает другую последовательность.
сделано так специально, чтобы иметь возможность получить одинаковую последовательность, для отладки алгоритма например .
{RASkov} (2008-01-06 18:15:00) [35]> [11] Loginov Dmitry © (06.01.08 18:05)
> Это как? При каждом нажатии на Button1 формируется один
> и тотже набор чисел? =-O
Дим, перечитай мои посты или.... вот.... вот такой код все объяснит
procedure TForm1.FormCreate(Sender: TObject);
var
a: array[1..20] of double;
I: integer;
S: String;
begin
for I := 1 to 20 do
a[i] := random;
S:='';
for I := 1 to 20 do
S:=S+floattostr(a[i])+#13#10;
ShowMessage(S);
Halt;
end;
:)
Loginov Dmitry (2008-01-06 18:05:00) [36]> всегда одно и то же :(
Это как? При каждом нажатии на Button1 формируется один и тотже набор чисел? =-O
{RASkov} (2008-01-06 18:01:00) [37]> [9] Loginov Dmitry © (06.01.08 17:46)
Хм... странно, Хотя и не совсем понятно, твой код [3] и там же список цифр - они не согласованны как-то(код и список) в коде видно показ первого элемента, но и сам список состоит из 20 элементов.... вообщем путанница. Вот у меня:
procedure TForm1.Button1Click(Sender: TObject);
var
a: array[1..20] of double;
I: integer;
S: String;
begin
for I := 1 to 20 do
a[i] := random;
S:='';
for I := 1 to 20 do
S:=S+floattostr(a[i])+#13#10;
ShowMessage(S);
end;
всегда одно и то же :(
Естественно
> Смысл какой в повторных нажиманиях кнопки?
Никакого :)
> [7] antonn (work) (06.01.08 17:40)
> в том то и дело, что не на всех
Тоже.... странно все это) Пробуй вариант из [2]...
Loginov Dmitry (2008-01-06 17:46:00) [38]> А ты, Дим, как проверял? с каждым новым запуском программы,
> или "тупо" несколько раз на кнопку понажимал...
> ? :)
> И как это у тебя двойка-то вообще получилась - первый результат....
С каждым запуском. Смысл какой в повторных нажиманиях кнопки?
Anatoly Podgoretsky (2008-01-06 17:45:00) [39]> antonn (work) (06.01.2008 16:51:00) [0]
У тебя ошибка в программе.
antonn (work) (2008-01-06 17:40:00) [40]
> Вообще-то такое поведение рэндома на всех процессорах...
в том то и дело, что не на всех, я только сейчас столкнулся) на интелах с НТ и многоядерных такое не видел.
> А Randomize в этом цикле случайно не крутится?
вызывается перед циклом.
в принципе если добавить в цикл ничего не меняется%)