rand

Тема в разделе "WASM.BEGINNERS", создана пользователем sato, 17 сен 2017.

  1. sato

    sato Забанен

    Публикаций:
    0
    Регистрация:
    15 янв 2012
    Сообщения:
    5
    почему максимальное псевдослучайное число не FFFF как наверно должно быть
    ,а 7FFF ?
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.242
    https://ru.wikipedia.org/wiki/Линейный_конгруэнтный_метод - читаем матчасть... если читать лень, то: "для улучшения статистических свойств числовой последовательности во многих генераторах псевдослучайных чисел используется только часть битов результата. Например, в стандарте ISO/IEC 9899 на язык Си приведен (но не указан в качестве обязательного) пример функции rand(), принудительно отбрасывающей младшие 16 и один старший разряд."
     
    Indy_ и yashechka нравится это.
  3. Мановар

    Мановар Active Member

    Публикаций:
    0
    Регистрация:
    2 дек 2016
    Сообщения:
    143
    Наверное, потому что FFFF = -1, а 7FFF = 32767, что соответствует RAND_MAX при применении rand().
    Но сейчас куча других подходов (например, что то типа этого).
    Код (ASM):
    1.  
    2. #include "stdafx.h"
    3. #include <iostream>
    4. #include <random>
    5. #include <ctime>
    6. template <typename T1>
    7. T1 getRandNumber(const T1 && begin, const T1 && end)
    8. {
    9. static std::mt19937 generator(time(0));
    10. std::uniform_real_distribution<> distribution(begin, end);
    11. return distribution(generator);
    12. }
    13. int main()
    14. {
    15. std::cout << "(long long): " << getRandNumber<long long>(1000000000000, 1000000000000000000) << std::endl
    16. << "(double):" << getRandNumber<double>(-234.45, 6574.75) << std::endl
    17. << "(int):" << getRandNumber<int>(-100000, 100000) << std::endl;
    18. system("pause");
    19. }
    20.  
    p0936.png
     

    Вложения:

    • p0936.png
      Размер файла:
      758,2 КБ
      Просмотров:
      733
    Последнее редактирование: 17 сен 2017
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Потому что сначала нужно вызывать
    Код (C):
    1. srand(GetTickCount());
     
    sato нравится это.
  5. al79

    al79 Алексей

    Публикаций:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    133
    Адрес:
    Екатеринбург
    Если нужно больше:
    Код (ASM):
    1. push 0
    2. mov ebx,esp
    3. invoke CryptAcquireContext,ebx,0,0,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT
    4. pop ebx
    5. invoke CrpytGenRandom,ebx,(длина в байтах),(куда положить)
    6. invoke CrpytReleaseContext,ebx,0
     
    yashechka нравится это.
  6. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    561
    В XRay используется такой алгоритм.
    Код (C++):
    1. ICN   s32     randI   ()               { return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff); }
    Проблема в том что, генерация последовательности совсем не случайная, например при массовой генерации случайных векторов(создания осколков при взрыве взрывных объектов) они тяготят к северу и к югу, т.е. есть резкая неравномерность. Пробовал использовать RDTSC, но тогда время выполнения увеличивается с 10 тактов до 70, на атлон 64 II эта команда выполняется тактов 60.
    А какие ещё есть быстрые генераторы? Длина последовательности может быть не очень большой, важна именно равномерность генерации.
     
  7. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Intro, используйте несколько генераторов и дёргайте их по очереди. Подберите только разные коэффициенты и разный seed.
     
  8. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Вызывайте и склеивайте, добавляйте солите и что хотите ;)
    Код (Text):
    1. INT x_rand(void)
    2. {
    3.     int r;
    4.     __asm
    5.     {
    6.         pushad
    7.             rdtsc
    8.             xor        edx, edx
    9.             dec        edx
    10.             shr        edx, 1
    11.             and        eax, edx
    12.             mov        r, eax
    13.             popad
    14.     }
    15.     return r;
    16. }
     
  9. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    RET,

    TSC является линейным счётчиком и не может быть использован в быстром цикле. Значение этого счетчика может служить magic-значением для дальнейшего вычисления рандом функции. Но если непрерывно использовать данный счётчик, то функция станет не рандом, в ней будут линейные закономерности, это значит что рандом функция станет вычисляемой.