Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2020, 11:52   #1
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию Генерация случайных чисел по нормальному закону распределения

Как в C++ сгенерировать случайные числа по нормальному закону распределения?
Есть ли какие-нибудь библиотечные функции для генерирования случайных чисел по нормальному закону распределения?
Если нет таких библиотечных функций, то как это сделать?
erslgoeirjh вне форума Ответить с цитированием
Старый 27.11.2020, 12:31   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Есть ли готовые библи для такого элементарнейшего действия - не знаю, но вот:
http://stratum.ac.ru/education/textb...lection25.html
Читать отсюда:Метод генерации нормально распределенных чисел,
Соль: если сложить, к примеру, ( 12 случайных равномерно распределённых на отрезке [0..1] чисел - 6 ) , получим одно число из нормального распределения с параметрами mV = 0, σV = 1.

Последний раз редактировалось digitalis; 27.11.2020 в 13:19.
digitalis вне форума Ответить с цитированием
Старый 27.11.2020, 14:41   #3
FrosyaZZ
Форумчанин
 
Регистрация: 16.11.2020
Сообщений: 243
По умолчанию

Никому не рассказывайте https://en.cppreference.com/w/cpp/nu...l_distribution
FrosyaZZ вне форума Ответить с цитированием
Старый 30.11.2020, 15:08   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Цитата:
Сообщение от FrosyaZZ Посмотреть сообщение
Никому не рассказывайте
Я не знаю, к кому обращён этот спич, но для сумлявающихся: этот метод известен ещё со времён Александра Невского, вот пример реализации:
Код:
begin
  Memo1.Clear ;
  for i := 1 to 100 do
     begin
       tmp := 0 ;
       for j := 1 to 12 do tmp := tmp + Random(1000)/1000.0 ;
       fmas[i] := tmp - 6.0 ;
     end ;

   for i := -6 to 6 do imas[i] := 0 ;
   for i := 1 to 100 do
      begin j := Round(fmas[i]) ; Inc(imas[j]) end ;
   for i := -6 to 6 do
     begin
        stro :=Format('%4d %4d',[i,imas[i]]) + '  ';
        for j := 1 to imas[i] do stro := stro + '#' ;
        Memo1.Lines.Add ( stro )
     end ;
   avr := 0 ;
   for i := 1 to 100 do avr := avr + fmas[i] ;
   avr := avr/100 ;
   syg := 0 ;
   for i := 1 to 100 do
      begin
         tmp := fmas[i] - avr ;
         syg := syg + tmp * tmp
      end ;
   syg := Sqrt(syg/(100.0-1.0) ) ;
   Memo1.Lines.Add ( Format (' mV= %9.6f σV= %9.6f',[avr,syg] ) )
end ; 

===============  
  -6    0  
  -5    0  
  -4    0  
  -3    1  #
  -2    8  ########
  -1   26  ##########################
   0   45  #############################################
   1   16  ################
   2    3  ###
   3    1  #
   4    0  
   5    0  
   6    0  
 mV= -0,200130 σV=  0,950434
И нечего это скрывать от народа, пусть знают все!

Последний раз редактировалось digitalis; 30.11.2020 в 15:19.
digitalis вне форума Ответить с цитированием
Старый 30.11.2020, 17:42   #5
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

digitalis, кроме типового метода по центральной предельной теореме ( сумма или ср. арифм. некоего кличества любых случайных чисел, чем больше тем лучше), есть более быстрый -
https://ru.wikipedia.org/wiki/Преобр...окса_—_Мюллера
В англ. версии есть код на С++
https://en.wikipedia.org/wiki/Box–Muller_transform

PS В VCL кроме равномерно распределенного Random есть и нормально распределенный RandG.

Последний раз редактировалось type_Oleg; 30.11.2020 в 18:06.
type_Oleg вне форума Ответить с цитированием
Старый 30.11.2020, 21:47   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Когда мне надо было, я освоил первый подвернувшийся. Меня устраивало.
digitalis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Генератор случайных чисел по нормальному закону Cope2 C++ Builder 3 29.03.2015 00:19
анализ соответствия дискретной выборки нормальному закону распределения s77lanselot77s Qt и кроссплатформенное программирование С/С++ 21 16.07.2013 17:43
проблема с библиотекой Boost при генерации чисел по закону Бетта-распределения Petruha-nsk Общие вопросы C/C++ 2 08.03.2012 10:16
Генерация случайных чисел Vodolazky Помощь студентам 1 14.12.2011 16:29
Генерация случайных чисел?! Evgeny_1 Фриланс 12 17.03.2010 14:23