R81..., если bitmap то получается что-то вот такое... Код (ASM): .686p option casemap:none .model flat,stdcall public start include include\windows.inc include include\kernel32.inc include include\msvcrt.inc includelib lib\kernel32.lib includelib lib\msvcrt.lib .data numbers db 100 dup(0) addr_number dword ? count byte ? .code start: mov eax,offset numbers mov edx,offset addr_number mov dword ptr [edx],eax generate: invoke crt_rand bt ax,6 ;183..218 jc check_low_bit ; IF 6 bit = 1 then check 0 bit mov ebx, dword ptr[addr_number] mov byte ptr [ebx],al inc ebx inc byte ptr [count] mov dword ptr [addr_number],ebx cmp byte ptr [count],100 jz stop_the_program jmp generate check_low_bit: bt ax,0 jc above_bound mov ebx, dword ptr[addr_number] mov byte ptr [ebx],al inc ebx inc byte ptr [count] mov dword ptr [addr_number],ebx cmp byte ptr [count],100 jz stop_the_program above_bound: jmp generate stop_the_program: push 5000 call Sleep push 0 call ExitProcess end
000011C9 00 ByteRnd db 0 000011CA 41 60 7C 98 B7 TabNum db 65,96,124,152,183,218 DA 000011D0 00000008 [ BitMapD dd 256/32 Dup (0) 00000000 ] ;.... ; Подготовка 0000031E B9 00000006 Mov eCx, 6 00000323 _001: 00000323 0F B6 81 MovZx eAx, [TabNum + eCx - 1] 000011C9 R 0000032A 0F AB 05 BTS [BitMapD], eAx 000011D0 R 00000331 E2 F0 LoopD _001 ;.... ; Проверка 00000333 0F B6 05 MovZx eAx, [ByteRnd] 000011C9 R 0000033A 0F A3 05 BT [BitMapD], eAx 000011D0 R 00000341 72 0C JC IzTabNum 00000343 ; Подходит ;.... P.S. в работе я не проверял
в прочем именно это, мой код и проверяет Код (Text): check_low_bit: bt ax,0 jc above_bound mov ebx, dword ptr[addr_number] mov byte ptr [ebx],al
Такую генерацию чисел в промежутках возможно использовать для эмуляции десятичных дробей ? что бы не использовать инструкции FPU
1. Генерировать номер интервала 2. Генерировать число внутри интервала Код (Text): a + random.random() * (b - a)
Спойлер: Гсч Код (ASM): randseed dd ? randcount db ? randomize: pusha call GetTickCount ; KERNEL32.GetTickCount add randseed, eax mov randcount, al popa retn process_randseed: mov eax, randseed imul eax, 214013 add eax, 2531011 mov randseed, eax dec randcount jz randomize retn ; вход: ECX=range ; выход: EAX=0..ECX-1 get_rnd_number: push ecx push edx call process_randseed cmp ecx, 65536 ; необходимо jb __mul ; только __div: xor edx, edx ; если div ecx ; ECX xchg edx, eax ; бывает jmp __exit ; >= 65536 __mul: shr eax, 16 imul eax, ecx shr eax, 16 __exit: pop edx pop ecx retn get_rnd_byte: call process_randseed shr eax, 24 retn get_rnd_dword: push ecx call get_rnd_byte shl eax, 24 xchg ecx, eax call get_rnd_byte shl eax, 16 or ecx, eax call get_rnd_byte mov ch, al call get_rnd_byte or eax, ecx pop ecx retn
Application, эти значения можно заменить своими ? или использовать обязательно эти Код (ASM): imul eax, 214013 add eax, 2531011
Может не очень скользкую, но оценить новые числа на разброс значений и повторения придется заново. --- Сообщение объединено, 5 янв 2026 --- Еще про циклы забыл. Можно выбрать такие числа, из-за которых ГСЧ будет повторять десяток чисел, а остальные никогда не выпадут.