Информация об изменениях

Сообщение Re[3]: Генерация случайных чисел по нормальному закону распр от 17.12.2020 11:47

Изменено 17.12.2020 19:45 watchmaker

Re[3]: Генерация случайных чисел по нормальному закону распреде
Здравствуйте, TailWind, Вы писали:

_>>Элементарно: вот код на lua

_>>
_>>function normal() 
_>>  local a,b=math.random(),math.random()
_>>  return 
_>>    math.sqrt(-2*math.log(a))*math.cos(2*math.pi*b),
_>>    math.sqrt(-2*math.log(b))*math.sin(2*math.pi*a)
_>>end
_>>
Эта функция возвращает пару чисел распределенных по нормальному закону

TW>У этой формулы есть проблема
TW>Она справедлива, если на вход подают непрерывную случайную величину
TW>Что не клёво, если вы хотите строить графики или проверять статистические теоремы

LOL. Если вы придрались к этому аспекту, то у вас явная проблема в приоритетах

В предложенной функции есть куда бóльший недостаток.
Его проще всего показать на картинке. Раз функция генерирует пары чисел (x, y), то поставим точку с этими координатами на плоскости и нарисуем плотность такого распределения:


Слева вариант по формулам из википедии. А справа вариант, генерируемый функцией за авторством kov_serg.
Правда ведь правый вариант выглядит немного не похожим на нормальное распределение?


То есть проблема функции в том, что она хотя и генерирует числа с нормальным распределением, но делает независимость есть только у отдельных компонент (только у первых чисел из пары или только у вторых), а всё множество не независимо.
Это примерно как если сгенерировать последовательность из чисел U = [uniform_random()]. Она случайная и элементы независимы. И последовательность чисел V = [(1 — x) for x in U] тоже случайная и в ней тоже элементы независимы. Но объединение последовательностей U и V уже не будет обладать таким свойством.
Re[3]: Генерация случайных чисел по нормальному закону распр
Здравствуйте, TailWind, Вы писали:

_>>Элементарно: вот код на lua

_>>
_>>function normal() 
_>>  local a,b=math.random(),math.random()
_>>  return 
_>>    math.sqrt(-2*math.log(a))*math.cos(2*math.pi*b),
_>>    math.sqrt(-2*math.log(b))*math.sin(2*math.pi*a)
_>>end
_>>
Эта функция возвращает пару чисел распределенных по нормальному закону

TW>У этой формулы есть проблема
TW>Она справедлива, если на вход подают непрерывную случайную величину
TW>Что не клёво, если вы хотите строить графики или проверять статистические теоремы

LOL. Если вы придрались к этому аспекту, то у вас явная проблема в приоритетах

В предложенной функции есть куда бóльший недостаток.
Его проще всего показать на картинке. Раз функция генерирует пары чисел (x, y), то поставим точку с этими координатами на плоскости и нарисуем плотность такого распределения:


Слева миллион точек полученных вызовом numpy.random.uniform. А справа вариант, генерируемый функцией за авторством kov_serg.
Правда ведь правый вариант выглядит немного не похожим на нормальное распределение?


То есть проблема функции в том, что она хотя и генерирует числа с нормальным распределением, но даёт независимость только y отдельных компонент (только у первых чисел из пары или только у вторых), а всё множество не независимо.
Это примерно как если сгенерировать последовательность из чисел U = [uniform_random()]. Она случайная и элементы независимы. И последовательность чисел V = [(1 — x) for x in U] тоже случайная и в ней тоже элементы независимы. Но объединение последовательностей U и V уже не будет обладать таким свойством.