Генерация случайных чисел!

Тема в разделе "WASM.BEGINNERS", создана пользователем SKAUT, 29 июл 2007.

  1. SKAUT

    SKAUT New Member

    Публикаций:
    0
    Регистрация:
    27 июл 2007
    Сообщения:
    5
    Люди скажите(немекните :)) как написать процедуру для генерации случайных чисел? Аналог rand() в Си!
    Извините если такая тема уже есть! Если есть То дайте ссылку! PLZ
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    посмотри исходники crt.
     
  3. SKAUT

    SKAUT New Member

    Публикаций:
    0
    Регистрация:
    27 июл 2007
    Сообщения:
    5
    n0name
    Сорри за мое незнание)) а где их взять???
     
  4. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    SKAUT

    Привет.... Вот генератор случайных чисел.... простой ) Код мой.. )

    Код (Text):
    1. Generator proc _From:DWORD, _To:DWORD
    2.     pushad
    3.     rdtsc
    4.     and eax, 0FFFh
    5.     or eax, 10h
    6.     mov ecx, eax        ; получаем значения счетчика...  (1)
    7.  
    8. Genner:             ; непосредственно генератор...Начальное содержание
    9.                 ; регистра ebx не важно
    10.     rdtsc
    11.     add ebx, eax
    12.     bswap ebx
    13.     loop Genner
    14.  
    15.     mov ecx, _To
    16.     sub ecx, _From
    17.     jz RetCur
    18.    
    19. CutRND:             ; укорачиваем значение до оптимального. (2)
    20.     mov edx, ebx       
    21.     shr ebx, 1
    22.     cmp ebx, ecx
    23.     ja CutRND
    24.     mov ebx, edx
    25.  
    26. Cuter:              ; Делитель (3)
    27.     sub ebx, ecx
    28.     cmp ebx, ecx
    29.     ja Cuter
    30.     add ebx, [_From]
    31.  
    32. GenEnd:            
    33.     mov dword ptr [esp+28],ebx
    34.     popad
    35.     ret
    36.  
    37. RetCur:             ; Определитель (4)
    38.     mov ebx, _From
    39.     jmp GenEnd
    40. Generator endp
    Весь код изначально занимал 5 строк
    Но когда программа выполнялась в реальных условиях - разброс значений был слишком низок... пришлось добавить (1). А чтобы убрать тормоза, которые возникли бы, если сумматор выдал значение предположим 0xFFFFFFFF, а разность между _To и _From всего единица, был добавлен (2)

    В общем код рабочий, с широким разбросом значений.
     
  5. AndNot

    AndNot New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2007
    Сообщения:
    49
    Или вот этот, взят из Дельфи:
    Код (Text):
    1. dataseg
    2.   RandSeed dd ?
    3.  
    4. codeseg
    5. ; на входе:
    6. ; eax - диапозон случайных чисел
    7. ; на выходе:
    8. ; eax - "случайное" число из заданного диапозона
    9. proc _Random
    10.         push    edx
    11.         imul    edx,[RandSeed],08088405h
    12.         inc     edx
    13.         mov     [RandSeed],edx
    14.         mul     edx
    15.         mov     eax,edx
    16.         pop     edx
    17.         ret
    18. endp _Random
    Перед использованием заносишь в RandSeed любое число, например из GetTickCount();
    Разброс не то что бы уж очень, но вполне нормальный, к тому же малый размер и неплохие скоростные характеристики :)
     
  6. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    AndNot
    А где тут генерация...?

    Тут идет линейная арифметическая операция...
    Т.е. чтобы работал твой генератор - ему на вход нужно подать случайное чило - я все праильно понял? ))) Фонарик на солнечных батарейках...
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Он сохраняет счетчик генерации.
     
  8. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    n0name
    дык, я вижу... но ведь это не случайное число...
    это все равно что:

    mov eax, [RND_NUM]
    xor eax, 12345678h
    add eax, 87654321h
    mov [RND_NUM], eax


    Это линейная операция...
     
  9. SKAUT

    SKAUT New Member

    Публикаций:
    0
    Регистрация:
    27 июл 2007
    Сообщения:
    5
    nitrotoluol
    THX! ЩА пойду разбирать ся!!!
     
  10. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    nitrotoluol

    Это конгруэнтный метод, всё верно. И это основа большинства ГПСЧ ЯВУ. У него есть период, достаточно большой, чтобы удовтелтворить большинство нужд.
     
  11. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    W4FhLF
    хм
    значит это мой минус в знаниях...
     
  12. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    Линейный, конгруэнтный, взят из исходника древнего ZIP'a.
     
  13. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    proc Random ;конгруэнтный метод генерации.
    rdtsc ;получить значение счетчика тактов (seed)
    imul eax,22695477 ; Borland рекомендует это значение 8)
    add eax, 1
    ret
    endp
     
  14. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    [​IMG]
    Пусть командами RCR или RCL сдвигается число имеющее размер m бит. Результат операции XOR между n-ым и последним (m-ым) разрядом помещается во флаг переноса и оттуда попадает в 1-ый разряд. Такая схема проходит совокупность состояний, которая определяется комбинациями битов в регистре после каждого сдвига и эта последовательность повторится через каждые K чисел, то есть является циклической с периодом K. Число возможных состояний m-разрядного регистра составляет K=2^m, то есть равно числу двоичных комбинаций m бит.