-Поиск по дневнику

Поиск сообщений в rss_forum_sources_ru

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 29.07.2007
Записей:
Комментариев:
Написано: 80


Генерация случайных чисел по нормальному закону распределения

Пятница, 08 Января 2021 г. 07:03 + в цитатник
mkudritsky: Обращаю внимание, что любимая Windows (даже Win 10) осталась в плане датчика генерации случайных чисел на уровне начала 1990-х годов.
Здесь RAND_MAX = 32767 = 2**15-1. Между тем, как в любой нормальной ОС RAND_MAX = 2**31-1.
Поэтому лично я использую ниже приведенный комплект программ для равномерной (не нормальной!) генерации случайных чисел.
Обратите на это внимание, если не устроит работа датчика нормально распределенных чисел.
    //---------------------------------------------------------------------------
    int iRand() {
    // Аналог rand() для юродиевых версий "любимой" Windows, где RAND_MAX=32767
    int iR=rand();
    if ( RAND_MAX == 32767 ) { // 32767=2**15-1
    iR <<= 15; // iR = iR*32768 (32768=2**15)
    int iL = rand();
    iR |= iL; // iR = rand()*(2**15)+rand;
    }
    return iR;
    }
    //---------------------------------------------------------------------------
    int iRandom(int iMin, int iMax) {
    // Возвращает случайное целое число между iMin и iMax. Границы могут генерироваться
    if (iMin < iMax)
    return iMin + iRand() % (iMax - iMin + 1);
    else if ( iMin == iMax )
    return iMin;
    else
    return iMin - 1; // Если границы заданы неверно, то возвращается такое число
    }
    //---------------------------------------------------------------------------
    double dbRandom(double dbMin, double dbMax) {
    // Возвращает случайное вещественное число между dbMin и dbMax. Границы могут генерироваться
    if (dbMin < dbMax) {
    if (RAND_MAX == 32767)
    return dbMin + ((dbMax - dbMin) * (double)iRand()) / 1073741823.0; // = double(2**30-1)
    else
    return dbMin + ((dbMax - dbMin) * (double)iRand()) / (double)RAND_MAX;
    }
    else if (dbMin == dbMax)
    return dbMin;
    else
    return dbMin - 1.0;
    }
    //---------------------------------------------------------------------------

https://forum.sources.ru/index.php?showtopic=420883&view=findpost&p=3843432

Метки:  

 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку