Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

random [D7, 2000, XP, 2003]


Страницы:   1 2 3

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 без сервис паков


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо