Люди скажите(немекните ) как написать процедуру для генерации случайных чисел? Аналог rand() в Си! Извините если такая тема уже есть! Если есть То дайте ссылку! PLZ
SKAUT Привет.... Вот генератор случайных чисел.... простой ) Код мой.. ) Код (Text): Generator proc _From:DWORD, _To:DWORD pushad rdtsc and eax, 0FFFh or eax, 10h mov ecx, eax ; получаем значения счетчика... (1) Genner: ; непосредственно генератор...Начальное содержание ; регистра ebx не важно rdtsc add ebx, eax bswap ebx loop Genner mov ecx, _To sub ecx, _From jz RetCur CutRND: ; укорачиваем значение до оптимального. (2) mov edx, ebx shr ebx, 1 cmp ebx, ecx ja CutRND mov ebx, edx Cuter: ; Делитель (3) sub ebx, ecx cmp ebx, ecx ja Cuter add ebx, [_From] GenEnd: mov dword ptr [esp+28],ebx popad ret RetCur: ; Определитель (4) mov ebx, _From jmp GenEnd Generator endp Весь код изначально занимал 5 строк Но когда программа выполнялась в реальных условиях - разброс значений был слишком низок... пришлось добавить (1). А чтобы убрать тормоза, которые возникли бы, если сумматор выдал значение предположим 0xFFFFFFFF, а разность между _To и _From всего единица, был добавлен (2) В общем код рабочий, с широким разбросом значений.
Или вот этот, взят из Дельфи: Код (Text): dataseg RandSeed dd ? codeseg ; на входе: ; eax - диапозон случайных чисел ; на выходе: ; eax - "случайное" число из заданного диапозона proc _Random push edx imul edx,[RandSeed],08088405h inc edx mov [RandSeed],edx mul edx mov eax,edx pop edx ret endp _Random Перед использованием заносишь в RandSeed любое число, например из GetTickCount(); Разброс не то что бы уж очень, но вполне нормальный, к тому же малый размер и неплохие скоростные характеристики
AndNot А где тут генерация...? Тут идет линейная арифметическая операция... Т.е. чтобы работал твой генератор - ему на вход нужно подать случайное чило - я все праильно понял? ))) Фонарик на солнечных батарейках...
n0name дык, я вижу... но ведь это не случайное число... это все равно что: mov eax, [RND_NUM] xor eax, 12345678h add eax, 87654321h mov [RND_NUM], eax Это линейная операция...
nitrotoluol Это конгруэнтный метод, всё верно. И это основа большинства ГПСЧ ЯВУ. У него есть период, достаточно большой, чтобы удовтелтворить большинство нужд.
proc Random ;конгруэнтный метод генерации. rdtsc ;получить значение счетчика тактов (seed) imul eax,22695477 ; Borland рекомендует это значение 8) add eax, 1 ret endp
Пусть командами RCR или RCL сдвигается число имеющее размер m бит. Результат операции XOR между n-ым и последним (m-ым) разрядом помещается во флаг переноса и оттуда попадает в 1-ый разряд. Такая схема проходит совокупность состояний, которая определяется комбинациями битов в регистре после каждого сдвига и эта последовательность повторится через каждые K чисел, то есть является циклической с периодом K. Число возможных состояний m-разрядного регистра составляет K=2^m, то есть равно числу двоичных комбинаций m бит.