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

Вниз

random збесился. что делать?   Найти похожие ветки 

 
Tsaiper ©   (2004-05-03 20:51) [0]

Делаю игрульку. Пошаговая стратегия. Почему-то при битве юнитов генератор стал выдавать несколько одинаковых случайных значений подряд, хотя процедура randomize запускается при каждом вызове функции ближнего боя. Юнит или пробивает броню при каждом ударе, или ни один удар не доходит до цели. Почему - не понятно :(

Помогите!


 
Thor ©   (2004-05-03 21:00) [1]

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


 
Bim   (2004-05-03 21:01) [2]

Делай проверку, если такое число уже было, то сгенерировать снова..


 
TButton ©   (2004-05-03 21:33) [3]

и Randomize не забывай


 
Tsaiper ©   (2004-05-03 21:42) [4]

Вершиной моих усилий по избавлению от глюка стала ф-ция следующего вида:

function random22(x: byte): byte;
var
 a: byte;
begin
 a:=random(x);
 repeat
   Randomize;
   result:=random(x);
 until result<>a;
end;

я пробовал давать ей сгенерить 6 значений подряд от 1 до 6, и она выдавала мне строчки наподобие 666661 или 555544. Кашмар!
От глюка удалось избавиться, удалив вызовы Randomize из ключевых (т.е. почти из всех) мест. Вот. Не знаю, кто глючит - я, компутер или делфи, но вот оно как...

чушь какая-то!


 
Mihey ©   (2004-05-03 21:46) [5]

Randomize не нужно каждый раз вызывать. Нужно вызывать один раз где-нибудь в OnCreate формы или даже в файле проекта при инициализации.


 
TButton ©   (2004-05-03 22:19) [6]

кстати, никто не знает почему
random(random(100));
или

n:=random(100);
z:=random(n);

вызывают переполнение стека???


 
TButton ©   (2004-05-03 22:37) [7]

кстати, рандомайз по умолчанию делается по текущему времени. так что подожди, мож само пройдет =)


 
Mihey ©   (2004-05-03 23:17) [8]

> TButton ©   (03.05.04 22:19) [6]

Когда и где такое было у тебя? Я попробовал код, всё работает без проблем.


 
Sirgfine   (2004-05-04 00:20) [9]

есть такая функция - RandG. В модуле Math объявлена. Разберись с ней и у тебя никогда не будет проблем с генерацией случайных чисел. Ещё можешь использовать now (например последних две цифры дробной части) тоже совпадений не может быть.
Короче думай, как избежать препятствий, а не ломай голову над их тараном.


 
MeF88 ©   (2004-05-04 00:56) [10]


> Когда и где такое было у тебя? Я попробовал код, всё работает
> без проблем.

Свободно работает. ;) Если ты конечно не создавал что-то вроде
procedure random(amout:Word);
begin
 result:=random(random(100));
end;
;)
> Randomize не нужно каждый раз вызывать. Нужно вызывать один
> раз где-нибудь в OnCreate формы или даже в файле проекта
> при инициализации.

МОжет быть в этом и причина, что randomize вызываешь каждый раз...


 
TButton ©   (2004-05-04 02:20) [11]

Когда и где такое было у тебя? Я попробовал код, всё работает без проблем.

было. в одном из старых проектов ушедших в небытье после того как Rовцы похерили мне винт. насчет второго не уверен, но первый вызывал ошибку стопудово. а использовалось оно для создания случайного числа в пределах от одного до 100, с таким условием, что чем больше число тем реже оно должно встречаться. далее на базе этого числа создавалась шмотка. это, если кто знает, был  у меня проект RealHero. вот в нем это все происходило.


 
MeF88 ©   (2004-05-04 08:56) [12]


> procedure random(amout:Word);

Ой извиняюсь первую строчку читать как:
function random(amout:Word):Word;


 
miek ©   (2004-05-04 10:37) [13]

Неплохо бы знать механизм генерации случайных чисел.
Randomize это то же самое, что RandSeed:= GetTickCount;


 
Tano ©   (2004-05-04 13:24) [14]

Random - псевдослучайная функция и опирается на системное время (до миллисекунд). Если вызывать слишком быстро друг за другом, то чем быстрее комп, тем менее случайная последовательность получиться. Randomize вызывай один раз на старте проги.
или
Используй из Math.


 
NailMan ©   (2004-05-04 14:04) [15]

Sirgfine
есть такая функция - RandG. В модуле Math объявлена. Разберись с ней и у тебя никогда не будет проблем с генерацией случайных чисел. Ещё можешь использовать now (например последних две цифры дробной части) тоже совпадений не может быть.
RandG выдает вещественные числа, а конвертить каждый раз real->dword навено будет лень.
Тем более RandG работает на том же самом Random.

Tsaiper ©
Советую использовать не стандартный Randomize(который действительно надо запускать один раз), а несколько другой:

Procedure MyRandomize;
begin
asm
  push        eax
  push        edx
  RDTSC
  mov         dword ptr randseed[0],eax
  pop         edx
  pop         eax
end;
end;


В качестве Randseed берет не системное время, а младшую половину 64-битного счетчика тактов процессора. Уж оно-то будет у всех всегда разное :-)

Его можно впихивать хоть перед каждым вызовом Random, т.о. получишь хорошую последовательность.

Я этим генератором Randseed получаю довольно правдоподобное звездное небо в демке.

Единственное но использования вышеприведенной процедуры: процессор должен поддерживать команду RDTSC, т.е. от пентиума и выше.


 
Tsaiper ©   (2004-05-04 15:06) [16]

ОК, спасибо всем!
буду пробовать


 
Kobik ©   (2004-05-04 18:50) [17]

>>кстати, никто не знает почему
>>random(random(100));
>>или
>>
>>n:=random(100);
>>z:=random(n);
>>вызывают переполнение стека???

Потому что нельзя сделать random(0);
А random(100) принимает значения от 0 до 99


 
TButton ©   (2004-05-05 00:17) [18]

>Потому что нельзя сделать random(0);
>А random(100) принимает значения от 0 до 99

резонно... я как-то не задумывался о том =)


 
Ермак ©   (2004-05-05 20:30) [19]

Нельзя вызвать Рандомайз повторно. Алгоритм генерации случайных чисел на самом деле псевдослучаен, каждое последующее число ОДНОЗНАЧНО выводится из предыдущего. Используется хитрый (но не особо-то сложный) алгоритм деления по модулю на подобранные простые числа. Это дает ооо-чень длинную (но заранее предопределенную) последовательность чисел. Ее период (то есть длина, на протяжении которой числа не повторяются), если не ошибаюсь, равен 2 в степени разрядности используемых чисел (т.е. 2 в 32). Рандомайз же только выбирает, С КАКОГО МЕСТА этой длинющей последовательности Рандом начнет выдавать числа. Естественно, если Рандомайз вызвать несколько раз рядом, то и выданы будут числа с одного куска.

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

А вообще, дискретная математика - рулез!


 
Twinge ©   (2004-05-06 01:41) [20]

Дополнение Kobik

В первый раз random(x) всегда выдает 0 если не используется randomize. random(0) - вот те и глюк... а лучше напиши
 random(random(100) +1 );  


 
TButton ©   (2004-05-06 10:06) [21]

re 19
это типа как в максе, с одинаковым RandomSeed два эффекта будут выглядеть абсолютно одинаково сколько их не рендери.


 
Proger   (2004-05-06 16:34) [22]

2 Tsaiper ©.Дай ты этому random"у успокоительное :)



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

Форум: "Игры";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.038 c
3-1090695422
viktor
2004-07-24 22:57
2004.08.22
FastReport


3-1090927751
Экспериментатор
2004-07-27 15:29
2004.08.22
Как правильно сортировать?


1-1091484317
denkop
2004-08-03 02:05
2004.08.22
"Правильное" завершение работы программы


3-1090923336
DeepGray
2004-07-27 14:15
2004.08.22
DBGrid и маски значений.


3-1090847343
MORA
2004-07-26 17:09
2004.08.22
2 лук-ап поля на одну таблицу





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский