![]() |
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 = (aXk +c) mod m. Несмотря на свою простоту, этот генератор иногда оказывается достаточно хорош. Однако в сложных задачах у него выявляется ряд недостатков, которые здесь нет смысла подробно рассматривать (анализ некоторых из них можно найти в ссылках в конце статьи). По этой причине проект ALGLIB включает в себя качественный низкоуровневый генератор случайных чисел, а также построенные на его основе генераторы случайных чисел из нескольких наиболее известных распределений.
Большинство алгоритмов генерации случайных чисел довольно-таки сильно привязаны к конкретному языку программирования и конкретной вычислительной платформе (главным образом в части работы с целыми числами, обработкой переполнений и т.д.). Однако Пьером Л'Экайером (Pierre L'Ecuyer) был приведен портируемый алгоритм, пригодный для реализации в рамках проекта ALGLIB. Данный алгоритм по своему качеству намного выше линейного конгруэнтного генератора. Хотя он не проходит некоторые сложные статистические тесты (мало какой алгоритм пройдет ВСЕ эти тесты), на мой взгляд, он достаточно хорош для применения в большинстве практических задач.
В состав модуля входят два типа подпрограмм: подпрограммы для работы с низкоуровневым генератором и для его настройки, и высокоуровневые подпрограммы, реализованные на базе низкоуровневого генератора.
К первой категории относятся подпрограммы RndIntegerBase, RndIntegerMax и RndInitialize. Первая подпрограмма возвращает случайное число в диапазоне от 0 (не включительно) до границы, возвращаемой подпрограммой RndIntegerMax. Эта подпрограмма является основой для всех генераторов случайных чисел в этом модуле. Подпрограмма RndInitialize служит для инициализации генератора и является аналогом подпрограммы randomize, с тем отличием, что она принимает не одно значение seed-переменной, а два.
Ко второй категории относится целый ряд подпрограмм. Для получения случайных целых чисел, расположенных в указанном диапазоне, может использоваться подпрограмма RndUniformI. Подпрограмма RndUniformR возвращает вещественные числа в диапазоне (0, 1). Подпрограммы RndNormal и RndNormal2 служат для генерации нормально распределенных случайных чисел. Первая из них генерирует одно нормально распределенное случайное число, вторая - пару независимых чисел (при этом по трудоемкости обе подпрограммы одинаковы, поэтому для генерации больших количеств случайных чисел стоит пользоваться второй подпрограммой). Подпрограмма RndExponential служит для генерации экспоненциально распределенных случайных чисел.
| C++ | hqrnd subpackage | |
| C# | hqrnd subpackage |
This article is intended for personal use only.
Исходный код на C#
Исходный код на C++
Исходный код на C++, использующий библиотеки MPFR/GMP.
Исходный код GMP доступен на сайте gmplib.org. Исходный код MPFR доступен на сайте www.mpfr.org.
Исходный код на Free Pascal.
Исходный код на Delphi.
Исходный код на VB.NET.
Исходный код на VBA.
Исходный код на Python (CPython и IronPython).
|
ALGLIB® - numerical analysis library, 1999-2012. |