Функция C++ rand(), нужен аналог на асм

Тема в разделе "WASM.ZEN", создана пользователем Chib777, 21 июл 2005.

  1. Chib777

    Chib777 Александр

    Публикаций:
    0
    Регистрация:
    22 сен 2003
    Сообщения:
    82
    Адрес:
    Ukraine, Odessa
    Вопрос 1: как нашёл в описании в MSDN, эта функция выдаёт случайные числа до 32768. В одной программе на C++ эта функция используеться, и выдаёт числа, но они при каждом запуске не разные, а повторяються в определённой последовательности, так и должно быть?

    Хотел бы узанть принцип работы rand()



    Вопрос 2: нашёл в masm32.lib функцию nrandom, и она нормально работает, только числа выдаёт по настоящему случайные каждый раз. Есть на асме аналог rand()?
     
  2. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Код (Text):
    1. ; ANSI Standard random number generator or another standart
    2. ansi_rand proc
    3. .data
    4. ParkerM dd 80000000h - 1
    5. .code
    6.   ; seed = seed * 0x41C64E6Du + 0x3039u; (ansi)
    7.   ; Генератор из книги Зубкова С.В.=> a=1 664 525, c=1 013 904 223
    8.   ; a=015A4E35h,c=1 (BC)
    9.   ; VC++6: a=343FDh,c=269EC3h и команда imul !!!
    10.   ; Генератор Парка-Миллера: a=7^5,c=0,m=2^31-1
    11.   mov  eax,343FDh
    12.   imul dword ptr seed ; У VC - imul, остальные - mul !
    13.   add  eax,269EC3h
    14.   mov  dword ptr seed,eax
    15.   ; return (seed>>0x10)&0x7FFF;
    16.   shr  eax,16
    17.   and  eax,07FFFh
    18.   ret
    19. ansi_rand endp




    Функция srand(...) инициализирует seed. Обычно пишут srand(time(NULL));. Все это так называемые конгруэнтные генераторы. В линуксе есть 48-ми битный drand48.
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257




    Нонсенс. Она инициализируется каждый раз одним и тем же seed - 12345678, поэтому не может выдавать при разных запусках программы разные последовательности.
     
  4. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Chib777

    На сайте Агнера Фога есть оптимизированный исходный код на асме, Marsaglia: "Mother of Randum Number", так вроде пишется он тебе на долго хватит, т.к. у него 2^250
     
  5. yGREK

    yGREK New Member

    Публикаций:
    0
    Регистрация:
    25 июл 2005
    Сообщения:
    5
    Адрес:
    Ukraine
  6. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Рулез! блин! Кайф! сенкс за линк!
     
  7. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Тут грелку делал (CPU/ALU) для соседней ветки, случайно получилось тоже что-то вроде генератора псевдо-случайных чисел (но наверняка с малым периодом):
    Код (Text):
    1.  
    2. context  dd  0, 0, 0
    3. ...
    4. mov   eax, [context + 0]
    5. mov   edx, [context + 4]
    6. mov   ecx, [context + 8]
    7. xor   eax, 101010101h   ; in eax must be initial value
    8. xadd  ecx, edx
    9. lea   edx, [eax + ecx]
    10. rcl   eax, 15
    11. xor   edx, ecx
    12. rcr   ecx, 17
    13. xadd  ecx, eax
    14. xor   eax, edx
    15. mov   [context + 0], ecx
    16. mov   [context + 4], edx
    17. mov   [context + 8], eax
    18.  


    Вобщем как-что с числами-незнаю, а проц греет.
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    рИальные паЦЦаны юзают синус для рандома :)


    Код (Text):
    1.  
    2. mov   ecx,12345 ; sizeof buffer
    3. mov   edi,buffer
    4. finit
    5. @@:
    6. push  ecx
    7. fild  dword [esp]
    8. fsin
    9. fstp  dword [esp]
    10. pop   eax
    11. stosb
    12. loop  @b
    13.  
     
  9. integer

    integer New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2007
    Сообщения:
    62
    Подскажите где можно найти сорс код сишного rand() из msvcrt ?
     
  10. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    %VCINSTALLDIR%\VC\crt\src\rand.c