![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
random [D7, 2000, XP, 2003]
antonn (work) © (2008-01-06 16:51:00)Фигня какая то:) На некоторых процессорах random() в цикле возвращает одни и теже значения. Насколько я понял, просто не успевает пересчитать из-за малого времени выполнения (фиг знает, как это объяснить, но слиип(1) возвращает к жизни функцию, но все тормозит с ним). Подскажите быструю функцию для получения случайного числа (интервал 0..1, например, шаг 1/360 - т.е. один градус для окружности), чтобы выдавала для 4-10 элементов более-менее случайные значения.
homm (2008-01-06 23:18:00) [1]> [45] antonn © (06.01.08 23:12)
> еще могу поныть, почему у Tbitmap перевернуты строки, так
> хотелось по голове надовать тому, кто это придумал :(
Это тоже вроде как от многово зависит
antonn (2008-01-06 23:12:00) [2]
> перечитай ветку. на этот раз внимательно...
> и почему пашет/не пашет не раз объяснялось и примеры давали
> (имхо, понятные такие примеры...).
это не вопрос был :) Это было нытье и оправдание, почему я не сталкивался с этим ранее %)
большое спасибо за объяснения :)
еще могу поныть, почему у Tbitmap перевернуты строки, так хотелось по голове надовать тому, кто это придумал :(
sniknik (2008-01-06 22:44:00) [3]> кстати, дома на коре2дуо пашет даже с рандомизе в цикле :((
перечитай ветку. на этот раз внимательно...
и почему пашет/не пашет не раз объяснялось и примеры давали (имхо, понятные такие примеры...).
homm (2008-01-06 21:28:00) [4]> [41] antonn © (06.01.08 21:20)
> Я думал это процессорная инструкция
:)))
Это функция, изменяющая значение рандомсида в зависимости от псевдо-случайной величины — времени или количетва тиков
antonn (2008-01-06 21:21:00) [5]кстати, дома на коре2дуо пашет даже с рандомизе в цикле :((
antonn (2008-01-06 21:20:00) [6]хм.. так, для общего развития, а randomize получается делает что то в процессе (потоке?), раз один раз нужно сделать? Я думал это процессорная инструкция, общая для всех. Но тогда получается любой процесс ее может вызвать и она должна сделать сброс ряда (ил по чем она там пытается рандомить)
turbouser (2008-01-06 20:29:00) [7]
> antonn (work) (06.01.08 20:18) [39]
>
> убил все рандомы, оставил только при создании классов
Достаточно один раз прописать в проекте:
program Project1;
...
begin
Randomize;
...
antonn (work) (2008-01-06 20:18:00) [8]
> Одного вызова Randomize в начале программы будет достаточно.
убил все рандомы, оставил только при создании классов (они редко, но пересоздаются, на всякий случай%)). Вроде помогло, щас еще постестирую. Обидно, что на других компах все работало всегда, и я только сейчас такое заметил...
ЗЫ домой уже пора, а я все мучаю этот комп %)
antonn (work) (2008-01-06 20:15:00) [9]
> sniknik © (06.01.08 20:01) [36]
вызов по таймеру (ГетТикКоунт должен быть не менее 15 от предыдущего срабатывания) (сорри, что пишу функции по-русски, у меня инет через дамваре, на третьем компе, очень трудно менять язык тыкая в иконку в трее:)), таймер как бесконечный цикл со слипами(1) . Или по клику, тогда предыдущее срабатывание применяется к текущему (ну в смысле сдвигается:)). Если очень быстро тыкать (хотя я не понимаю, я что терминатор, долбить быстрее чем компутер обсчитывает (только он там еще и рисует эти частицы, самая нагруженная функция, которая идет перед вызовом этой с рандомом)) то получается фигня :(
> homm © (06.01.08 19:59) [35]
если быстро ее вызывать, то либо пучком, либо одинаковые :)
если вызывать только "вручную" - все рандомно.
Zeqfreed (2008-01-06 20:08:00) [10]> antonn (work) (06.01.08 19:56) [33]
Ну все верно. Получается, что если ты успеваешь за секунду нажать мышь несколько раз, то у тебя Randomize инициализирует (как выше выяснилось лишь на некоторых процессорах) генератор одинаковым значением и соответственно выдает одинаковые последовательности. Одного вызова Randomize в начале программы будет достаточно.
sniknik (2008-01-06 20:01:00) [11]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;
вопрос, сколько раз вызывается SetPointGFX? т.е. вообщето, по названию, это установка точки, а выше идет речь о разлетающихся частицах, траектория которых похоже высчитывается с помощью задаваемых точек. так?
а раз так то выше у тебя есть еще цикл, может неявный, может ты там по таймеру вызываешь, главное цикл есть и внутри цикла randomize... т.е. ситуация о которой так много говорят. присутствует. и не исправлена...
homm (2008-01-06 19:59:00) [12]> [32] sniknik © (06.01.08 19:49)
Что то из сказанного до этого было не выяснено?
> [33] antonn (work) (06.01.08 19:56)
> однако часто эти получаются пучком каким то (в смысле выдает
> близкие значения, а не на полном диапазоне 0-314, кол-во
> элеметов - 14)
Часто это как, в соответствии со случайным распределением? Не понимаю, какие проблемы, если это случаноераспределение, а не равномерное.
antonn (work) (2008-01-06 19:58:00) [13]короче, я в печали %(
antonn (work) (2008-01-06 19:56:00) [14]хм... я возможно начинаю разгребать) рандомизе у меня вроде вызывается то один раз, она вне цикла.
Просто сама функция вызова стоит после другой, очень напряжной, и когда первая тормозит - рандом начинает выдавать одинаковые значения. Вроде так (просто чтобы проверить приходится остервенело тыкать мышкой и вызывать функцию :)). Вызов этой функции в цикле 100% приводит к одинаковым значениям. Но если убрать рандомизе и сделать его только при старте программы, то значения разные, однако часто эти получаются пучком каким то (в смысле выдает близкие значения, а не на полном диапазоне 0-314, кол-во элеметов - 14)
sniknik (2008-01-06 19:49:00) [15]> Если счетчик отсутствует, то используется GetTickCount.
ну так, вопрос то как раз про то что "на некоторых компьютерах", предположительно с отсутствующим ...
проверяем
procedure TForm1.Button1Click(Sender: TObject);
var
a: array[1..20] of double;
i: integer;
begin
for i:= 1 to 20 do begin
//randomize; //проверка раз, счетчик или есть или нет
RandSeed:= GetTickCount; //проверка два, эмуляция отсутствия, даже если он есть
a[i]:= random;
end;
Memo1.Lines.Clear;
for i:= 1 to 20 do
Memo1.Lines.Add(FloatToStr(a[i]));
end;
в первом варианте у меня тоже все значения разные (атлон 3200+)
второй - повторы. о которых и говорил в [17]. а для железа которое не поддерживает этого счетчика вариант 1 будет подобен второму.
в итоге все одно ошибка в 17 строке. т.к. обсуждаемый код это то как делать нельзя. в нормальном варианте randomize вызывается 1 раз. и тогда неважно есть там чтото или нет, повторов не будет.
homm (2008-01-06 19:48:00) [16]Включи дебаг дсу, и поставь точку останова на рандомайз. Посмотри, внутри цикла точно к ней не обращается никто?
antonn (work) (2008-01-06 19:45:00) [17]да, разные, я там еще порядковый номер из i брал - cadr.timer:=i;
уже пол дня удивляюсь, пол кода перекомментировал :)
homm (2008-01-06 19:41:00) [18]Не всматривался в код, ссори.
Надо весь код смотреть.
Ты уверен, что здесь
Cadr:=pGFX_effectE(FList.Items[i]);
выбираются валидные элементы? Может ты мусор собираешь из листа, а потом чудо что без AV пишеш что то куда то.
homm (2008-01-06 19:39:00) [19]> [26] antonn (work) (06.01.08 19:34)
> даже если убрать все классы и вывести обычной функцией -
> вот этот card.angle всегда одни и теже
еше бы. Тут же одна переменная, ты ей в цикле присваиваешь значение, прои выходе из цткла у не будет лишь одно значение ;)
antonn (work) (2008-01-06 19:35:00) [20][26]+ Дельфи5,6,7 без сервис паков