псевдослучайная последовательность

Тема в разделе "WASM.WIN32", создана пользователем mc black, 3 мар 2006.

Статус темы:
Закрыта.
  1. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    Подскажите, плс., алгоритм формирования псевдослучайной последовательности числел в заданном пределе значений ("от" и "до"). Смотрел какой-то пример, понял, что исходной точкой является какой-то параметр, связанный с временем, н-р GetTickCount, только не разобрал границу м/у генерацией числа и самой программой.. Мне нужно получить от 10 до 1000 таких значений за короткий интервал времени, чтобы они достаточно равномерно были распределены. Может у кого есть готовый, поделитесь.. Высоких требований не предъявляю (MASM32), единственное 1000 штук надо сгенерировать в доли секунды. Надо это в простой логической игре.
     
  2. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    На моём сайте (www.codexxi.com) есть такой AsmDev, в приложении к нему есть старые (16-бит DOS) исходные коды. Там должен быть такой генератор. Переведи его на 32-бит - замени регистры и вмето миллисекунд от DOS бери результат от GetTickCount().
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Дональд Кнут. Том 2, Глава 3.
     
  4. drmad

    drmad New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    332
    Адрес:
    Russia
  5. Ation

    Ation New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2005
    Сообщения:
    92
    Адрес:
    Zaporozhie
    Пасматри чё наваял по этому поводу дядька RainMan

    [​IMG] 2011385049__lcg.rar
     
  6. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    Всем баааальшое спасибо! Буду изучать всё, что вы тут написали. Кое-что нашел и я в своём архивчике исходников. Пишите ещё, тема пока не закрыта.
     
  7. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    Используй команду счётчика тактов (edx:eax) rdtsc
     
  8. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Vasil



    И получишь строго неубывающую последовательность. Блестящий совет :) Послушайте, что умный DEN говорит, хоть это и редко с ним бывает :)
     
  9. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    Ну ладно, не используй команду счётчика тактов (edx:eax) rdtsc (упс, я слово "последовательность" упустил) :)
     
  10. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    Ну почему же не использовать rdtsc в качестве стартового псевдослучайного числа, а последовательность, например, формировать по алгоритму "Xorshift - 128". Это по-моему даже не хуже, чем GetTickCount? Я видел один алгоритм, где в инициализации ГПСЧ использована rdtsc. Вот он (nrand.asm):
    Код (Text):
    1. ; ###################################################################### ###
    2. ;
    3. ;                     Park Miller random number algorithm.
    4. ;
    5. ;                      Written by Jaymeson Trudgen (NaN)
    6. ;                   Optimized by Rickey Bowers Jr. (bitRAKE)
    7. ;
    8. ; ###################################################################### ###
    9.  
    10. ; modified by S.T.A.S.
    11.  
    12. align 16
    13. nrandom     proc    base:DWORD
    14.             pop     EAX     ; get return address
    15.             pop     EBX     ; get arg
    16.             push    EAX
    17. nrandom     endp
    18.  
    19. nrandomd    PROC ; EBX= base
    20.             mov     eax, nrandom_seed
    21.             xor     edx, edx
    22.             mov     ecx, 127773
    23.             div     ecx
    24.             mov     ecx, eax
    25.             mov     eax, 16807
    26.             mul     edx
    27.             mov     edx, ecx
    28.             mov     ecx, eax
    29.             mov     eax, 2836
    30.             mul     edx
    31.             sub     ecx, eax
    32.             xor     edx, edx
    33.             mov     eax, ecx
    34.             mov     nrandom_seed, ecx
    35.             div     EBX;base
    36.             mov     eax, edx
    37.         ret
    38. nrandomd     ENDP
    39.  
    40. nseed   proc ;TheSeed:DWORD
    41. RTDATA
    42. align   dword
    43.         nrandom_seed dd 0
    44. .code
    45. ;    mov eax, TheSeed
    46.         rdtsc
    47.         mov nrandom_seed, eax
    48.         ret
    49. nseed   endp




    Впрочем, не в пользу rdtsc ещё и то, что инструкция начинает поддерживаться начиная только с P5, а многие привыкли писать win32-программы, ограничившись инструкциями .386 / .386P
     
  11. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Дык это же SEED! А мы толкуем о последовательности :)
     
Статус темы:
Закрыта.