Генерация чисел в промежутках

Тема в разделе "WASM.A&O", создана пользователем Entropy, 24 сен 2025.

  1. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    222
    R81..., если bitmap то получается что-то вот такое...
    Код (ASM):
    1.  
    2. .686p
    3. option casemap:none
    4. .model flat,stdcall
    5.  
    6.  
    7.  
    8.  
    9.  
    10. public start
    11.  
    12. include include\windows.inc
    13. include include\kernel32.inc
    14. include include\msvcrt.inc
    15.  
    16. includelib lib\kernel32.lib
    17. includelib lib\msvcrt.lib
    18.  
    19. .data
    20. numbers db 100 dup(0)
    21.  
    22. addr_number dword ?
    23.  
    24. count byte ?
    25.  
    26. .code
    27. start:
    28.  
    29. mov eax,offset numbers
    30. mov edx,offset addr_number
    31.  
    32. mov dword ptr [edx],eax
    33.  
    34. generate:
    35. invoke crt_rand
    36.  
    37. bt ax,6  ;183..218
    38. jc check_low_bit  ; IF 6 bit = 1 then check 0 bit
    39.  
    40. mov ebx, dword ptr[addr_number]
    41. mov byte ptr [ebx],al
    42.  
    43. inc ebx
    44. inc byte ptr [count]
    45. mov dword ptr [addr_number],ebx
    46.  
    47. cmp byte ptr [count],100
    48. jz stop_the_program
    49.  
    50. jmp generate
    51.  
    52. check_low_bit:
    53. bt ax,0
    54. jc above_bound
    55. mov ebx, dword ptr[addr_number]
    56. mov byte ptr [ebx],al
    57.  
    58. inc ebx
    59. inc byte ptr [count]
    60.  
    61. mov dword ptr [addr_number],ebx
    62.  
    63. cmp byte ptr [count],100
    64. jz stop_the_program
    65.  
    66. above_bound:
    67. jmp generate
    68.  
    69.  
    70. stop_the_program:
    71. push 5000
    72. call Sleep
    73.  
    74. push 0
    75. call ExitProcess
    76.  
    77. end
    78.  
     
  2. R81...

    R81... Active Member

    Публикаций:
    0
    Регистрация:
    1 фев 2020
    Сообщения:
    177
    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. в работе я не проверял
     
    Последнее редактирование: 20 дек 2025
  3. R81...

    R81... Active Member

    Публикаций:
    0
    Регистрация:
    1 фев 2020
    Сообщения:
    177
    далее
    сами
     
  4. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    222
    в прочем именно это, мой код и проверяет
    Код (Text):
    1.  
    2. check_low_bit:
    3. bt ax,0
    4. jc above_bound
    5. mov ebx, dword ptr[addr_number]
    6. mov byte ptr [ebx],al
    7.  
     
  5. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    222
    Такую генерацию чисел в промежутках возможно использовать для эмуляции десятичных дробей ? что бы не использовать инструкции FPU
     
  6. Application

    Application Active Member

    Публикаций:
    1
    Регистрация:
    15 окт 2022
    Сообщения:
    125
    1. Генерировать номер интервала
    2. Генерировать число внутри интервала
    Код (Text):
    1. a + random.random() * (b - a)
     
    Последнее редактирование: 1 янв 2026
  7. Application

    Application Active Member

    Публикаций:
    1
    Регистрация:
    15 окт 2022
    Сообщения:
    125
    Код (ASM):
    1. randseed                dd      ?
    2. randcount               db      ?
    3.  
    4. randomize:              pusha
    5.                         call    GetTickCount    ; KERNEL32.GetTickCount
    6.                         add     randseed, eax
    7.                         mov     randcount, al
    8.                         popa
    9.                         retn
    10.  
    11. process_randseed:       mov     eax, randseed
    12.                         imul    eax, 214013
    13.                         add     eax, 2531011
    14.                         mov     randseed, eax
    15.                         dec     randcount
    16.                         jz      randomize
    17.                         retn
    18.  
    19. ; вход:  ECX=range
    20. ; выход: EAX=0..ECX-1
    21.  
    22. get_rnd_number:         push    ecx
    23.                         push    edx
    24.                         call    process_randseed
    25.                         cmp     ecx, 65536  ; необходимо
    26.                         jb      __mul       ; только
    27. __div:                  xor     edx, edx    ; если
    28.                         div     ecx         ; ECX
    29.                         xchg    edx, eax    ; бывает
    30.                         jmp     __exit      ; >= 65536
    31. __mul:                  shr     eax, 16
    32.                         imul    eax, ecx
    33.                         shr     eax, 16
    34. __exit:                 pop     edx
    35.                         pop     ecx
    36.                         retn
    37.  
    38. get_rnd_byte:           call    process_randseed
    39.                         shr     eax, 24
    40.                         retn
    41.  
    42. get_rnd_dword:          push    ecx
    43.                         call    get_rnd_byte
    44.                         shl     eax, 24
    45.                         xchg    ecx, eax
    46.                         call    get_rnd_byte
    47.                         shl     eax, 16
    48.                         or      ecx, eax
    49.                         call    get_rnd_byte
    50.                         mov     ch, al
    51.                         call    get_rnd_byte
    52.                         or      eax, ecx
    53.                         pop     ecx
    54.                         retn
     
    MaKsIm нравится это.
  8. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    222
    Application, эти значения можно заменить своими ? или использовать обязательно эти
    Код (ASM):
    1.  
    2. imul    eax, 214013
    3. add    eax, 2531011
    4.  
     
  9. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    425
    Это сишный rand(). Есть rand_c(), эта получше.
     
  10. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    216
    Может не очень скользкую, но оценить новые числа на разброс значений и повторения придется заново.
    --- Сообщение объединено, 5 янв 2026 ---
    Еще про циклы забыл. Можно выбрать такие числа, из-за которых ГСЧ будет повторять десяток чисел, а остальные никогда не выпадут.
     
    miilalex и Application нравится это.