Главная       Скачать       Коммерческая поддержка       FAQ       Forum       О нас       Английская версия

Генерация случайных чисел

This article is outdated due to the last updates in the ALGLIB package.
It will be rewritten soon. Till then you may find information you need in the reference manual.

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

Существует ряд алгоритмов для генерации случайных чисел. В состав стандартных библиотек практически всех языков программирования входит линейный конгруэнтный генератор, использующий для генерации очередного случайного числа Xk+1  константы a, c и m, а также предыдущее случайное число: Xk+1  = (aX+c) mod m. Несмотря на свою простоту, этот генератор иногда оказывается достаточно хорош. Однако в сложных задачах у него выявляется ряд недостатков, которые здесь нет смысла подробно рассматривать (анализ некоторых из них можно найти в ссылках в конце статьи). По этой причине проект ALGLIB включает в себя качественный низкоуровневый генератор случайных чисел, а также построенные на его основе генераторы случайных чисел из нескольких наиболее известных распределений.

Большинство алгоритмов генерации случайных чисел довольно-таки сильно привязаны к конкретному языку программирования и конкретной вычислительной платформе (главным образом в части работы с целыми числами, обработкой переполнений и т.д.). Однако Пьером Л'Экайером (Pierre L'Ecuyer) был приведен портируемый алгоритм, пригодный для реализации в рамках проекта ALGLIB. Данный алгоритм по своему качеству намного выше линейного конгруэнтного генератора. Хотя он не проходит некоторые сложные статистические тесты (мало какой алгоритм пройдет ВСЕ эти тесты), на мой взгляд, он достаточно хорош для применения в большинстве практических задач.

Алгоритмы

В состав модуля входят два типа подпрограмм: подпрограммы для работы с низкоуровневым генератором и для его настройки, и высокоуровневые подпрограммы, реализованные на базе низкоуровневого генератора.

К первой категории относятся подпрограммы RndIntegerBase, RndIntegerMax и RndInitialize. Первая подпрограмма возвращает случайное число в диапазоне от 0 (не включительно) до границы, возвращаемой подпрограммой RndIntegerMax. Эта подпрограмма является основой для всех генераторов случайных чисел в этом модуле. Подпрограмма RndInitialize служит для инициализации генератора и является аналогом подпрограммы randomize, с тем отличием, что она принимает не одно значение seed-переменной, а два.

Ко второй категории относится целый ряд подпрограмм. Для получения случайных целых чисел, расположенных в указанном диапазоне, может использоваться подпрограмма RndUniformI. Подпрограмма RndUniformR возвращает вещественные числа в диапазоне (0, 1). Подпрограммы RndNormal и RndNormal2 служат для генерации нормально распределенных случайных чисел. Первая из них генерирует одно нормально распределенное случайное число, вторая - пару независимых чисел (при этом по трудоемкости обе подпрограммы одинаковы, поэтому для генерации больших количеств случайных чисел стоит пользоваться второй подпрограммой). Подпрограмма RndExponential служит для генерации экспоненциально распределенных случайных чисел.

Ссылки по теме

  1. Pierre L'Ecuyer, 'Efficient and Portable Combined Random Number Generators'
  2. Pierre L'Ecuyer, 'TestU01: A C Library for Empirical Testing of Random Number Generators'
  3. Pierre L'Ecuyer, other publications
  4. Wikipedia, 'Pseudorandom number generator'

Manual entries

C++ hqrnd subpackage   
C# hqrnd subpackage   

This article is intended for personal use only.

Скачать ALGLIB

C#

Исходный код на C#

Downloads page

 

C++

Исходный код на C++

Downloads page

 

C++, арифметика высокой точности

Исходный код на C++, использующий библиотеки MPFR/GMP.

Исходный код GMP доступен на сайте gmplib.org. Исходный код MPFR доступен на сайте www.mpfr.org.

Downloads page

 

FreePascal

Исходный код на Free Pascal.

Downloads page

 

Delphi

Исходный код на Delphi.

Downloads page

 

VB.NET

Исходный код на VB.NET.

Downloads page

 

VBA

Исходный код на VBA.

Downloads page

 

Python

Исходный код на Python (CPython и IronPython).

Downloads page

 

 

ALGLIB® - numerical analysis library, 1999-2017.
ALGLIB is registered trademark of the ALGLIB Project.