Difference between revisions of "Generating Random Numbers/ru"

From Free Pascal wiki
Jump to navigationJump to search
(Created page with "{{Generating Random Numbers}} right '''Random numbers''' are important resources for scientific applications, education, game development and vi...")
 
 
(16 intermediate revisions by 2 users not shown)
Line 3: Line 3:
 
[[File:fpc source logo.png|right]]
 
[[File:fpc source logo.png|right]]
  
'''Random numbers''' are important resources for scientific applications, education, game development and visualization. They play a key role in numeric simulation.
+
'''Случайные числа''' являются важными ресурсами для научных приложений, образования, разработки игр и визуализации. Они играют ключевую роль в численном моделировании.
  
Algorithm-generated random numbers are pseudo-random numbers. They belong to a (large) set of repeating numbers, whose sequence is impossible or at least difficult to predict. Unlike Delphi, that uses a linear congruential generator.(See [[Delphi compatible LCG Random]]), Free Pascal uses a MersenneTwister algorithm for its standard <code>[[doc:rtl/system/random.html|random]]</code> function as defined in [[RTL]]. Before its first use, FPC's random number generator has to be initialized with a single call of the <code>[[doc:rtl/system/randomize.html|randomize]]</code> function, which sets the seed of the generator. Preferably this is done in the launch phase of the program.
+
Генерируемые алгоритмом случайные числа являются псевдослучайными числами. Они принадлежат (большому) набору повторяющихся чисел, последовательность которых невозможно или, по крайней мере, трудно предсказать. В отличие от Delphi, в котором используется линейный конгруэнтный генератор (см. [[Delphi compatible LCG Random]]), Free Pascal использует алгоритм MersenneTwister для своей стандартной <code>[[doc:rtl/system/random.html|random]]</code> функции, определенной в [[RTL]]. Перед первым использованием генератор случайных чисел FPC должен быть проинициализирован единичным вызовом функции <code>[[doc:rtl/system/randomize.html|randomize]]</code>, которая устанавливает начальное число генератора. Предпочтительнее это делать на этапе запуска программы.
  
Alternatively, on Unix- and Linux-based systems, the virtual devices <code>[[Dev random|/dev/random]]</code> and <code>/dev/urandom</code> are available. They generate (pseudo) random numbers based on hardware.
+
Кроме того, в системах на основе Unix и Linux доступны виртуальные устройства <code>[[Dev random|/dev/random]]</code> и <code>/dev/urandom</code>. Они генерируют (псевдо) случайные числа на основе оборудования.
  
A third option is to use random numbers from external sources, either from specialised hardware devices or from public sources, e.g. based on radioactive decay data.
+
Третий вариант - использовать случайные числа из внешних источников, либо из специализированных аппаратных устройств, либо из общедоступных источников, например. на основе данных радиоактивного распада.
  
== Uniform Distribution ==
+
== Равномерное распределение ==
 +
Непрерывное равномерное распределение (также называемое прямоугольным распределением) представляет собой семейство симметричных вероятностных распределений. Здесь для каждого члена семьи все интервалы одинаковой длины в поддержке распределения одинаково вероятны.
  
The continuous uniform distribution (also referred to as rectangular distribution) represents a family of symmetric probability distributions. Here, for each member of the family all intervals of the same length on the distribution's support are equally probable.
+
Стандартная функция [[RTL]] <code>[[doc:rtl/system/random.html|random]]</code> генерирует случайные числа с равномерным распределением. При вызове без параметра <code>random</code> выдает псевдослучайное число с плавающей запятой в интервале [0, 1), т.е. 0 <= result < 1. Если <code>random</code> вызывается с аргументом <tt>longint L</tt>, возвращается случайное значение longint в интервале [0, L).
  
The standard [[RTL]] function <code>[[doc:rtl/system/random.html|random]]</code> generates random numbers that fulfill a uniform distribution. If called without parameter <code>random</code> delivers a floating point pseudorandom number in the interval [0, 1), i.e. 0 <= result < 1. if <code>random</code> is called with a longint argument L it delivers a longint random in the interval [0, L).
+
Дополнительный набор равномерно распределенных генераторов случайных чисел представлен в <code>[[Marsaglia's pseudo random number generators|генераторах псевдослучайных чисел Марсальи.]]</code><br><br>
 +
Равномерно распределенные случайные числа полезны не для каждого приложения. Для создания случайных чисел других распределений необходимы специальные алгоритмы.
  
A further set of uniformly distributed random number generators is presented in <code>[[Marsaglia's pseudo random number generators|Marsaglia's pseudo random number generators.]]</code><br><br>
+
== Нормальное (гауссово) распределение ==
Uniformly distributed random numbers are not useful for every application. In order to create random numbers of other distributions special algorithms are necessary:
 
  
== Normal (Gaussian) Distribution ==
+
Одним из наиболее распространенных алгоритмов получения нормально распределенных случайных чисел из равномерно распределенных случайных чисел является [https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%91%D0%BE%D0%BA%D1%81%D0%B0_%E2%80%94_%D0%9C%D1%8E%D0%BB%D0%BB%D0%B5%D1%80%D0%B0 преобразование Бокса-Мюллера]. Следующая функция вычисляет распределенные по Гауссу случайные числа:
  
One of the more common algorithms to produce normally distributed random numbers from uniformly distributed random numbers is the [http://en.wikipedia.org/wiki/Box–Muller_transform Box-Müller approach]. The following function calculates Gaussian-distributed random numbers:
+
<syntaxhighlight lang=pascal>
 
 
<syntaxhighlight>
 
 
  function rnorm (mean, sd: real): real;
 
  function rnorm (mean, sd: real): real;
  {Calculates Gaussian random numbers according to the Box-Müller approach}
+
  {Вычисляет гауссовы случайные числа в соответствии с преобразованием Бокса-Мюллера}
 
   var
 
   var
 
   u1, u2: real;
 
   u1, u2: real;
Line 36: Line 35:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
The same algorithm is used by the [[doc:rtl/math/randg.html|randg]] randg function from the [[RTL]] [[doc:rtl/math/index.html|math]] unit:
+
Тот же алгоритм используется функцией randg [[doc:rtl/math/randg.html|randg]] из модуля [[RTL]] [[doc:rtl/math/index.html|math]]:
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
function randg(mean,stddev: float): float;
 
function randg(mean,stddev: float): float;
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Exponential Distribution ==
+
== Экспоненциальное распределение ==
  
An exponential distribution occurs frequently in real-world problems. A classical example is the distribution of waiting times between independent Poisson-random events, e.g. the radioactive decay of nuclei [Press et al. 1989].
+
Экспоненциальное распределение часто встречается в реальных задачах. Классическим примером является распределение времени ожидания между независимыми пуассоновскими случайными событиями, например, радиоактивный распад ядер [Press et al. 1989].
  
The following function delivers a single real random number out of an exponential distribution. ''Rate'' is the inverse of the mean, and the constant ''RESOLUTION'' determines the granularity of generated random numbers.
+
Следующая функция возвращает одно действительное случайное число из экспоненциального распределения. ''Rate'' является обратным к среднему значению, а константа ''RESOLUTION'' определяет гранулярность генерируемых случайных чисел.
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
function randomExp(a, rate: real): real;
 
function randomExp(a, rate: real): real;
 
const
 
const
Line 67: Line 66:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Gamma Distribution ==
+
== Гамма-распределение ==
  
The gamma distribution is a two-parameter family of continuous random distributions. It is a generalization of both the exponential distribution and the Erlang distribution. Possible applications of the gamma distribution include modelling and simulation of waiting lines, or queues, and actuarial science.
+
Гамма-распределение - это двухпараметрическое семейство непрерывных случайных распределений. Это обобщение как экспоненциального распределения, так и распределения Эрланга. Возможные применения гамма-распределения включают моделирование и имитацию линий ожидания, или очередей, и актуарную(страховую) науку.
  
The following function delivers a single real random number out of a gamma distribution. The shape of the distribution is defined by the parameters ''a'', ''b'' and ''c''. The function makes use of the function '''randomExp''' as defined above.
+
Следующая функция возвращает одно действительное случайное число из гамма-распределения. Форма распределения определяется параметрами ''a'', ''b'' и ''c''. Функция использует функцию '''randomExp''', как определено выше.
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
function randomGamma(a, b, c: real): real;
 
function randomGamma(a, b, c: real): real;
 
const
 
const
Line 121: Line 120:
 
   end
 
   end
 
   else if c = 1 then
 
   else if c = 1 then
     { Gamma distribution becomes exponential distribution, if c = 1 }
+
     { Гамма-распределение становится экспоненциальным, если c = 1 }
 
   begin
 
   begin
 
     randomGamma := randomExp(a, b);
 
     randomGamma := randomExp(a, b);
Line 148: Line 147:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Erlang Distribution ==
+
== Распределение Эрланга ==
  
The Erlang distribution is a two parameter family of continuous probability distributions. It is a generalization of the exponential distribution and a special case of the gamma distribution, where ''c'' is an integer. The Erlang distribution has been first described by Agner Krarup Erlang in order to model the time interval between telephone calls. It is used for queuing theory and for simulating waiting lines.
+
Распределение Эрланга - это двухпараметрическое семейство непрерывных распределений вероятностей. Это обобщение экспоненциального распределения и частный случай гамма-распределения, где ''c'' - целое число. Распределение Эрланга было впервые описано Агнером Крарупом Эрлангом для моделирования временного интервала между телефонными звонками. Он используется для теории очередей и для моделирования линий ожидания.
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
   function randomErlang(mean: real; k: integer): real;
 
   function randomErlang(mean: real; k: integer): real;
 
   const
 
   const
Line 177: Line 176:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Poisson Distribution ==
+
== Распределение Пуассона ==
The Poisson distribution applies to integer values. It represents the probability of ''k'' successes, when the probability of a success in each trial is small and the rate of occurrence (the mean value) is constant.
+
Распределение Пуассона применяется к целочисленным значениям. Оно представляет вероятность успеха ''k'', когда вероятность успеха в каждом испытании мала, а частота появления (среднее значение) постоянна.
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
function randomPoisson(mean: integer): integer;
 
function randomPoisson(mean: integer): integer;
{ Generator for Poisson distribution (Donald Knuth's algorithm) }
+
{ Генератор для распределения Пуассона (алгоритм Дональда Кнута) }
 
const
 
const
 
   RESOLUTION = 1000;
 
   RESOLUTION = 1000;
Line 202: Line 201:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== t Distribution ==
+
== t-распределение (Стьюдента) ==
The t distribution (also referred to a Student's t distribution, since it was published by William Sealy Gosset in 1908 under the pseudonym ''Student'') is a continuous probability distribution. Its shape is defined by one parameter, the degrees of freedom (''df''). In statistics, many estimators are t distributed. Therefore, Student's t-distribution plays a major role in a number of widely used statistical analyses, including Student's t-test for assessing the statistical significance of the difference between two sample means, the construction of confidence intervals for the difference between two population means, and in linear regression analysis. The t-distribution also arises in Bayesian analysis of data from a normal family.
+
t-распределение (также относится к t-распределению Стьюдента, поскольку оно было опубликовано Уильямом Сили Госсетом в 1908 году под псевдонимом ''Student'') - это непрерывное распределение вероятностей. Его форма определяется одним параметром, степенями свободы (''df''). В статистике много оценок являются t-распределением. Таким образом, t-распределение Стьюдента играет главную роль в ряде широко используемых статистических анализов, включая t-критерий Стьюдента для оценки статистической значимости разницы между двумя средними выборками, построение доверительных интервалов для разницы между двумя средними значениями, и в линейном регрессионном анализе. Т-распределение также возникает при Байесовском выводе данных из нормального семейства.
  
The following algorithm depends on the [[RTL]] function <code>[[doc:rtl/system/random.html|random]]</code> and on the '''[[#Chi Squared Distribution|randomChisq]]''' function
+
Следующий алгоритм зависит от функции [[RTL]] <code>[[doc:rtl/system/random.html|random]]</code> и от функции '''[[#Chi Squared Distribution|randomChisq]]'''
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>function randomT(df: integer): real;
function randomT(df: integer): real;
+
{ Генератор для распределения Стьюдента }
{ Generator for Student's t distribution }
 
 
begin
 
begin
 
   if df < 1 then  
 
   if df < 1 then  
Line 215: Line 213:
 
     randomT := randg(0, 1) / sqrt(randomChisq(df) / df);
 
     randomT := randg(0, 1) / sqrt(randomChisq(df) / df);
 
   end;
 
   end;
end;
+
end;</syntaxhighlight>
</syntaxhighlight>
 
  
== Chi Squared Distribution ==
+
== Распределение хи-квадрат ==
The chi squared distribution is a continuous distribution of random numbers with ''df'' degrees of freedom. It is the distribution of a sum of the squares of ''df'' independent standard normal random variables. The chi squared distribution has numerous applications in inferential statistics, e.g. in estimating variances and for chi-squared tests. It is a special [[#Gamma Distribution|gamma distribution]] with ''c'' = ''df''/ 2 and ''b'' = 2. Therefore the following function depends on the function '''randomGamma'''.
+
Распределение хи-квадрат - это непрерывное распределение случайных чисел со степенями свободы ''df''. Это распределение суммы квадратов независимых стандартных нормальных случайных величин. Распределение хи-квадрат имеет множество применений в выводной статистике, например, в оценке дисперсий и для тестов хи-квадрат. Это специальное [[#Gamma Distribution|гамма-распределение]] с ''c'' = ''df''/ 2 and ''b'' = 2. Поэтому следующая функция зависит от функции '''randomGamma'''.
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
function randomChisq(df: integer): real;
 
function randomChisq(df: integer): real;
 
begin
 
begin
Line 231: Line 228:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== F Distribution ==
+
== F-распределение (Фишера) ==
The F distribution, also referred to as Fisher-Snedecor distribution, is a continuous probability distribution. It is used for F Test and ANOVA. It has two degrees of freedom that serve as shape parameters ''v'' and ''w'' and that are positive integers. The following function '''randomF''' makes use of '''randomChisq'''.
+
Распределение F, также называемое распределением Фишера-Снедекора, является непрерывным распределением вероятности. Используется для F-теста(критерия Фишера) и ANOVA(ANalysis Of VAriance, или дисперсионный анализ). Оно имеет две степени свободы, которые служат параметрами формы ''v'' и ''w'', и являются положительными целыми числами. Следующая функция '''randomF''' использует '''randomChisq'''.
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
function randomF(v, w: integer): real;
 
function randomF(v, w: integer): real;
 
begin
 
begin
Line 244: Line 241:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== See also ==
+
== См.также ==
 
* [[Dev random]]
 
* [[Dev random]]
 
* [[Functions for descriptive statistics]]
 
* [[Functions for descriptive statistics]]
Line 251: Line 248:
 
* [[Delphi compatible LCG Random]]
 
* [[Delphi compatible LCG Random]]
  
==References==
+
==Рекомендации==
 
#[http://projecteuclid.org/DPubS/Repository/1.0/Disseminate?view=body&id=pdf_1&handle=euclid.aoms/1177706645 G. E. P. Box and Mervin E. Muller, ''A Note on the Generation of Random Normal Deviates'', The Annals of Mathematical Statistics (1958), Vol. 29, No. 2 pp. 610&ndash;611]
 
#[http://projecteuclid.org/DPubS/Repository/1.0/Disseminate?view=body&id=pdf_1&handle=euclid.aoms/1177706645 G. E. P. Box and Mervin E. Muller, ''A Note on the Generation of Random Normal Deviates'', The Annals of Mathematical Statistics (1958), Vol. 29, No. 2 pp. 610&ndash;611]
 
#Dietrich, J. W. (2002). [http://openlibrary.org/books/OL24586469M/Der_Hypophysen-Schilddrüsen-Regelkreis Der Hypophysen-Schilddrüsen-Regelkreis]. Berlin, Germany: Logos-Verlag Berlin. ISBN 978-3-89722-850-4. OCLC 50451543.
 
#Dietrich, J. W. (2002). [http://openlibrary.org/books/OL24586469M/Der_Hypophysen-Schilddrüsen-Regelkreis Der Hypophysen-Schilddrüsen-Regelkreis]. Berlin, Germany: Logos-Verlag Berlin. ISBN 978-3-89722-850-4. OCLC 50451543.

Latest revision as of 08:35, 26 July 2019

Deutsch (de) English (en) suomi (fi) français (fr) polski (pl) русский (ru)

fpc source logo.png

Случайные числа являются важными ресурсами для научных приложений, образования, разработки игр и визуализации. Они играют ключевую роль в численном моделировании.

Генерируемые алгоритмом случайные числа являются псевдослучайными числами. Они принадлежат (большому) набору повторяющихся чисел, последовательность которых невозможно или, по крайней мере, трудно предсказать. В отличие от Delphi, в котором используется линейный конгруэнтный генератор (см. Delphi compatible LCG Random), Free Pascal использует алгоритм MersenneTwister для своей стандартной random функции, определенной в RTL. Перед первым использованием генератор случайных чисел FPC должен быть проинициализирован единичным вызовом функции randomize, которая устанавливает начальное число генератора. Предпочтительнее это делать на этапе запуска программы.

Кроме того, в системах на основе Unix и Linux доступны виртуальные устройства /dev/random и /dev/urandom. Они генерируют (псевдо) случайные числа на основе оборудования.

Третий вариант - использовать случайные числа из внешних источников, либо из специализированных аппаратных устройств, либо из общедоступных источников, например. на основе данных радиоактивного распада.

Равномерное распределение

Непрерывное равномерное распределение (также называемое прямоугольным распределением) представляет собой семейство симметричных вероятностных распределений. Здесь для каждого члена семьи все интервалы одинаковой длины в поддержке распределения одинаково вероятны.

Стандартная функция RTL random генерирует случайные числа с равномерным распределением. При вызове без параметра random выдает псевдослучайное число с плавающей запятой в интервале [0, 1), т.е. 0 <= result < 1. Если random вызывается с аргументом longint L, возвращается случайное значение longint в интервале [0, L).

Дополнительный набор равномерно распределенных генераторов случайных чисел представлен в генераторах псевдослучайных чисел Марсальи.

Равномерно распределенные случайные числа полезны не для каждого приложения. Для создания случайных чисел других распределений необходимы специальные алгоритмы.

Нормальное (гауссово) распределение

Одним из наиболее распространенных алгоритмов получения нормально распределенных случайных чисел из равномерно распределенных случайных чисел является преобразование Бокса-Мюллера. Следующая функция вычисляет распределенные по Гауссу случайные числа:

 function rnorm (mean, sd: real): real;
 {Вычисляет гауссовы случайные числа в соответствии с преобразованием Бокса-Мюллера}
  var
   u1, u2: real;
 begin
   u1 := random;
   u2 := random;
   rnorm := mean * abs(1 + sqrt(-2 * (ln(u1))) * cos(2 * pi * u2) * sd);
  end;

Тот же алгоритм используется функцией randg randg из модуля RTL math:

function randg(mean,stddev: float): float;

Экспоненциальное распределение

Экспоненциальное распределение часто встречается в реальных задачах. Классическим примером является распределение времени ожидания между независимыми пуассоновскими случайными событиями, например, радиоактивный распад ядер [Press et al. 1989].

Следующая функция возвращает одно действительное случайное число из экспоненциального распределения. Rate является обратным к среднему значению, а константа RESOLUTION определяет гранулярность генерируемых случайных чисел.

function randomExp(a, rate: real): real;
const
  RESOLUTION = 1000;
var
  unif: real;
begin
  if rate = 0 then
    randomExp := NaN
  else
  begin
    repeat
      unif := random(RESOLUTION) / RESOLUTION;
    until unif <> 0;
    randomExp := a - rate * ln(unif);
  end;
end;

Гамма-распределение

Гамма-распределение - это двухпараметрическое семейство непрерывных случайных распределений. Это обобщение как экспоненциального распределения, так и распределения Эрланга. Возможные применения гамма-распределения включают моделирование и имитацию линий ожидания, или очередей, и актуарную(страховую) науку.

Следующая функция возвращает одно действительное случайное число из гамма-распределения. Форма распределения определяется параметрами a, b и c. Функция использует функцию randomExp, как определено выше.

function randomGamma(a, b, c: real): real;
const
  RESOLUTION = 1000;
  T = 4.5;
  D = 1 + ln(T);
var
  unif: real;
  A2, B2, C2, Q, p, y: real;
  p1, p2, v, w, z: real;
  found: boolean;
begin
  A2 := 1 / sqrt(2 * c - 1);
  B2 := c - ln(4);
  Q := c + 1 / A2;
  C2 := 1 + c / exp(1);
  found := False;
  if c < 1 then
  begin
    repeat
      repeat
        unif := random(RESOLUTION) / RESOLUTION;
      until unif > 0;
      p := C2 * unif;
      if p > 1 then
      begin
        repeat
          unif := random(RESOLUTION) / RESOLUTION;
        until unif > 0;
        y := -ln((C2 - p) / c);
        if unif <= power(y, c - 1) then
        begin
          randomGamma := a + b * y;
          found := True;
        end;
      end
      else
      begin
        y := power(p, 1 / c);
        if unif <= exp(-y) then
        begin
          randomGamma := a + b * y;
          found := True;
        end;
      end;
    until found;
  end
  else if c = 1 then
    { Гамма-распределение становится экспоненциальным, если c = 1 }
  begin
    randomGamma := randomExp(a, b);
  end
  else
  begin
    repeat
      repeat
        p1 := random(RESOLUTION) / RESOLUTION;
      until p1 > 0;
      repeat
        p2 := random(RESOLUTION) / RESOLUTION;
      until p2 > 0;
      v := A2 * ln(p1 / (1 - p1));
      y := c * exp(v);
      z := p1 * p1 * p2;
      w := B2 + Q * v - y;
      if (w + D - T * z >= 0) or (w >= ln(z)) then
      begin
        randomGamma := a + b * y;
        found := True;
      end;
    until found;
  end;
end;

Распределение Эрланга

Распределение Эрланга - это двухпараметрическое семейство непрерывных распределений вероятностей. Это обобщение экспоненциального распределения и частный случай гамма-распределения, где c - целое число. Распределение Эрланга было впервые описано Агнером Крарупом Эрлангом для моделирования временного интервала между телефонными звонками. Он используется для теории очередей и для моделирования линий ожидания.

  function randomErlang(mean: real; k: integer): real;
  const
    RESOLUTION = 1000;
  var
    i: integer;
    unif, prod: real;
  begin
    if (mean <= 0) or (k < 1) then
      randomErlang := NaN
    else
    begin
      prod := 1;
      for i := 1 to k do
      begin
        repeat
          unif := random(RESOLUTION) / RESOLUTION;
        until unif <> 0;
        prod := prod * unif;
      end;
      randomErlang := -mean * ln(prod);
    end;
  end;

Распределение Пуассона

Распределение Пуассона применяется к целочисленным значениям. Оно представляет вероятность успеха k, когда вероятность успеха в каждом испытании мала, а частота появления (среднее значение) постоянна.

function randomPoisson(mean: integer): integer;
{ Генератор для распределения Пуассона (алгоритм Дональда Кнута) }
const
  RESOLUTION = 1000;
var
  k: integer;
  b, l: real;
begin
  assert(mean > 0, 'mean < 1');
  k := 0;
  b := 1;
  l := exp(-mean);
  while b > l do
  begin
    k := k + 1;
    b := b * random(RESOLUTION) / RESOLUTION;
  end;
  randomPoisson := k - 1;
end;

t-распределение (Стьюдента)

t-распределение (также относится к t-распределению Стьюдента, поскольку оно было опубликовано Уильямом Сили Госсетом в 1908 году под псевдонимом Student) - это непрерывное распределение вероятностей. Его форма определяется одним параметром, степенями свободы (df). В статистике много оценок являются t-распределением. Таким образом, t-распределение Стьюдента играет главную роль в ряде широко используемых статистических анализов, включая t-критерий Стьюдента для оценки статистической значимости разницы между двумя средними выборками, построение доверительных интервалов для разницы между двумя средними значениями, и в линейном регрессионном анализе. Т-распределение также возникает при Байесовском выводе данных из нормального семейства.

Следующий алгоритм зависит от функции RTL random и от функции randomChisq

function randomT(df: integer): real;
{ Генератор для распределения Стьюдента }
begin
  if df < 1 then 
    randomT := NaN
  else begin
    randomT := randg(0, 1) / sqrt(randomChisq(df) / df);
  end;
end;

Распределение хи-квадрат

Распределение хи-квадрат - это непрерывное распределение случайных чисел со степенями свободы df. Это распределение суммы квадратов независимых стандартных нормальных случайных величин. Распределение хи-квадрат имеет множество применений в выводной статистике, например, в оценке дисперсий и для тестов хи-квадрат. Это специальное гамма-распределение с c = df/ 2 and b = 2. Поэтому следующая функция зависит от функции randomGamma.

function randomChisq(df: integer): real;
begin
  if df < 1 then 
    randomChisq := NaN
  else
    randomChisq := randomGamma(0, 2, 0.5 * df);
end;

F-распределение (Фишера)

Распределение F, также называемое распределением Фишера-Снедекора, является непрерывным распределением вероятности. Используется для F-теста(критерия Фишера) и ANOVA(ANalysis Of VAriance, или дисперсионный анализ). Оно имеет две степени свободы, которые служат параметрами формы v и w, и являются положительными целыми числами. Следующая функция randomF использует randomChisq.

function randomF(v, w: integer): real;
begin
  if (v < 1) or (w < 1) then
    randomF := NaN
  else
    randomF := randomChisq(v) / v / (randomChisq(w) / w);
end;

См.также

Рекомендации

  1. G. E. P. Box and Mervin E. Muller, A Note on the Generation of Random Normal Deviates, The Annals of Mathematical Statistics (1958), Vol. 29, No. 2 pp. 610–611
  2. Dietrich, J. W. (2002). Der Hypophysen-Schilddrüsen-Regelkreis. Berlin, Germany: Logos-Verlag Berlin. ISBN 978-3-89722-850-4. OCLC 50451543.
  3. Press, W. H., B. P. Flannery, S. A. Teukolsky, W. T. Vetterling (1989). Numerical Recipes in Pascal. The Art of Scientific Computing, Cambridge University Press, ISBN 0-521-37516-9.
  4. Richard Saucier, Computer Generation of Statistical Distributions, ARL-TR-2168, US Army Research Laboratory, Aberdeen Proving Ground, MD, 21005-5068, March 2000.
  5. R.U. Seydel, Generating Random Numbers with Specified Distributions. In: Tools for Computational Finance, Universitext, DOI 10.1007/978-1-4471-2993-6_2, © Springer-Verlag London Limited 2012
  6. Christian Walck, Hand-book on STATISTICAL DISTRIBUTIONS for experimentalists, Internal Report SUF–PFY/96–01, University of Stockholm 2007