True random number service

Fast random number generators

There are many «random number generators» across a whole spectrum from «extremely fast» to «relatively slow» and from «easy for even a human to see patterns» to «unlikely that unassisted humans could ever see any patterns» to «cryptographically secure and, after seeded with adequate amounts of entropy, as far as we can tell, indistinguishable from random to any attacker using less than all the energy produced by humanity for a month.»

Non-cryptographic-strength random number generators that still give excellent output (unlikely that unassisted humans could ever see any patterns) include the Mersenne twister, multiply-with-carry, Lagged Fibonacci generator, Well equidistributed long-period linear, Xorshift, etc.

1.6 Последовательная сложность алгоритма

Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.

Шаг E

Сложность вычисления определителя произвольной матрицы ковариации \Sigma методом Гаусса — O(M^3);

Сложность вычисления матрицы, обратной произвольной матрице ковариации \Sigma методом Гаусса — O(M^3);

Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации — O(K * M^3)

С учетом заранее вычисленных определителей и обратных матриц сложность вычисления p(x | \mu,\Sigma) составит: O(M^2);

Суммарно сложность шага E составит O(N * M^2 * K + K * M^3)

Шаг M

Сложность обновления весов кластеров O(K * N);

Сложность обновления центров кластеров O(K * M * N);

Сложность обновления одной матрицы ковариации O(N * M);

Сложность обновления всех матриц ковариации O(K * M * N);

Суммарно сложность шага M алгоритма — O(K * M * N);

Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит O(K * M^2 * N + K * M^3 + K * M * N).

В предположении, что размерность объектов много меньше их количества M \lt\lt N получим сложность итерации O(K * M^2 * N).

Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большу́ю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее — вынесены за основной цикл шага E. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации \Sigma.

Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось O(M), а суммарная сложность шага E и сложность всей итерации составит O(K * M * N).

The CSPRNG Workaround

To fix our identifier code we needed a replacement for Math.random() and we needed it fast. Lots of alternative PRNG implementations exist for Javascript, but we were looking for something that —

  • Has a long enough period to generate all of our 2¹³² identifiers
  • Is well supported and battle tested

Luckily, the Node.js standard library has another PRNG that meets both requirements: , a cryptographically secure PRNG (CSPRNG) that calls OpenSSL’s (which, according to the docs, produces a random number by generating the SHA-1 hash of 8184 bits of internal state, which it regularly reseeds from various entropy sources). If you’re in a web browser crypto.getRandomValues() should do the same job.

This isn’t a perfect general solution for three reasons —

  • CSPRNGs almost always use non-linear transformations and are generally slower than non-cryptographic alternatives
  • Many CSPRNG systems are not seed-able, which makes it impossible to create a reproducible sequence of values (e.g., for testing)
  • CSPRNGs emphasize unpredictability over all other measures of quality, some of which might be more important for your use case

However —

  • Speed is relative, and CSPRNGs are fast enough for most use cases (I can get about 100MB/s of random data from crypto.getRandomValues() in Chrome on my machine)
  • In the limit, unpredictability implies an inability to distinguish the generator’s output from true randomness, which implies everything else we want out of a pseudo-random sequence
  • It’s likely that a generator advertised as “cryptographically secure” has been carefully code reviewed and subjected to many empirical tests of randomness

We’re still making some assumptions, but they are evidence-based and pragmatic. If you’re unsure about the quality of your non-cryptographic alternatives, and unless you need deterministic seeding or require rigorous proofs of quality measures, using a CSPRNG is your best option. If you don’t trust your standard library’s CSPRNG (and you shouldn’t for cryptographic purposes) the right solution is to use urandom, which is managed by the kernel (Linux uses a scheme similar to OpenSSL’s, OS X uses Bruce Schneier’s Yarrow generator).

I can’t tell you the exact cycle length of crypto.randomBytes() because as far as I know there’s no closed form solution to that problem (i.e., no one knows). All I can say is that with a large state space and a continuous stream of new entropy coming in, it should be safe. If you trust OpenSSL to generate your public/private key pairs then it doesn’t make much sense not to trust it here. Empirically, once we swapped our call to Math.random() with a call to crypto.randomBytes() our collision problem went away.

In fact, Chrome could just have Math.random() call the same CSPRNG they’re using for crypto.randomBytes(), which appears to be . That said, there are lots of fast, high quality non-cryptographic alternatives, too. Let’s put a final nail in the MWC1616 coffin and take a look at some other options.

Cryptographic random number techniques compatible with ancient and modern browsers

One way to generate true random numbers in JavaScript is to capture mouse events and add them into a pool of entropy, keeping track of some (hopefully conservative) estimate of the entropy added. Once the pool is «full» (estimates indicate that at least 128 bits of entropy have been added), use some cryptographically secure random number generator to generate random numbers from the pool — typically by using a one-way hash so that a sequence of a few thousand output numbers are not enough to deduce the state of the entropy pool and hence predict the next output number.

One implementation:

4.4. Класс Random и его функции

генерировать случайные числа требуется во многих приложениях. КлассRandom содержит все
необходимые для этого средства. КлассRandom имеет
конструктор класса: для того, чтобы вызывать методы класса, нужно вначале
создавать экземпляр класса. ЭтимRandom отличается от
классаMath, у которого все поля и методы
статические, что позволяет обойтись без создания экземпляров классаMath.

и всякий «настоящий» класс, классRandom является
наследником классаObject, а,
следовательно, имеет в своем составе и методы родителя. Рассмотрим только
методы классаRandom со статусомpublic, необходимые для
генерирования последовательностей случайных чисел. Класс имеет защищенные
методы, знание которых полезно при необходимости создания собственных потомков
классаRandom, но этим мы заниматься не будем.

рассмотрение с конструктора класса. Он перегружен и имеет две реализации. Одна
из них позволяет генерировать неповторяющиеся при каждом запуске серии
случайных чисел. Начальный элемент такой серии строится на основе текущей даты
и времени, что гарантирует уникальность серии. Этот конструктор вызывается без
параметров. Он описан какpublicRandom(). Другой
конструктор с параметром —publicRandom (int) обеспечивает
важную возможность генерирования повторяющейся серии случайных чисел. Параметр
конструктора используется для построения начального элемента серии, поэтому при
задании одного и того же значения параметра серия будет повторяться.

методpublicintNext() при каждом
вызове возвращает положительное целое, равномерно распределенное в некотором
диапазоне. Диапазон задается параметрами метода. Три реализации метода
отличаются набором параметров:

publicintNext() — метод без
параметров выдает целые положительные числа во всем положительном диапазоне
типа int;

publicintNext(intmax) выдает целые
положительные числа в диапазоне ;

publicintNext(intmin, intmax) выдает целые
положительные числа в диапазоне .

МетодpublicdoubleNextDouble() имеет одну
реализацию. При каждом вызове этого метода выдается новое случайное число,
равномерно распределенное в интервале [0-1).

один полезный метод класса Random позволяет при
одном обращении получать целую серию случайных чисел. Метод имеет параметр —
массив, который и будет заполнен случайными числами. Метод описан как publicvoidNextBytes (bytebuffer). Так как параметрbuffer представляет
массив байтов, то, естественно, генерированные случайные числа находятся в
диапазоне .

Приведем теперь
пример работы со случайными числами. Как обычно, для проведения экспериментов
по генерации случайных чисел создадим метод Rand в классеTesting. Вот программный
код этого метода:

/// summary>

/// Эксперименты
с классом

/// summary>

public void

int initRnd
= 77;

= new Random();

= new Random(initRnd);

// случайные
числа в диапазоне [0,1)

числа в диапазоне[0,1)»);

(int i

» +
i + «=» + realRnd.NextDouble());


случайные числа в диапазоне

intmin= -100, max= -10;

числа в диапазоне [» +
min+ «,»

(int i

» +
i + «= » + realRnd.Next(min,





            Console.WriteLine(«Массивслучайныхчиселвдиапазоне «);

(int i

» +
i + «= » + bar);


} //Rand

вывода можно увидеть на рис. 19.

Рисунок 19. Генерирование последовательностей
случайных чисел в процедуре Rand

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

Доброго времени суток! Эта статья носит практический характер и в ней я расскажу о том, как использовать генератор случайных чисел в C# и для чего это Вам может пригодиться. Хотя, если на чистоту, то речь пойдет о генераторе псевдослучайных чисел…

Где нам могут понадобиться случайные числа, да на самом деле можно привести в пример много случаев, например, криптография, или механизмы разрешения различных коллизий. Поверьте, рано или поздно Вам с такой  необходимостью придется столкнуться, если уже не пришлось, раз читаете эту статью. К счастью, в C# генератор случайных чисел разработан до нас, и единственное что нам нужно будет, большинстве случаев, это просто правильно им пользоваться. И так, для генерации случайных чисел в программах, написанных на C#, предназначен класс «Random».

//Создание объекта для генерации чисел
Random rnd = new Random();

//Получить очередное (в данном случае - первое) случайное число
int value = rnd.Next();

//Вывод полученного числа в консоль

Как видите — ничего сложного! Сначала создаем объект типа «Random», потом вызываем его метод «Next», в результате чего и получаем случайное число. Если мы вызовем метод «Next» несколько раз, то получим разные числа. Такой код, даст нам четыре разных, случайных числа:

//Создание объекта для генерации чисел
Random rnd = new Random();
int value = rnd.Next();  //Получить очередное случайное число
int value1 = rnd.Next(); //Получить очередное случайное число
int value2 = rnd.Next(); //Получить очередное случайное число
int value3 = rnd.Next(); //Получить очередное случайное число
Console.WriteLine(value);  //Вывод числа в консоль
Console.WriteLine(value1); //Вывод числа в консоль
Console.WriteLine(value2); //Вывод числа в консоль
Console.WriteLine(value3); //Вывод числа в консоль

А теперь, давайте слегка усложним задачу, представим, что нам нужно получить случайное число в определенном диапазоне. Но и эта задача выполняется довольно просто:

//Создание объекта для генерации чисел
Random rnd = new Random();

//Получить случайное число (в диапазоне от 0 до 10)
int value = rnd.Next(0, 10);

//Вывод числа в консоль

Как видите, и это выполняется несложно! Для этого мы всего лишь вызвали метод «Next» с двумя параметрами, первый из которых обозначает нижнюю границу диапазона, а второй — верхнюю.

Но это ещё не всё, есть еще один важный нюанс, на самом деле генератор случайных чисел является генератором псевдослучайных чисел, т.е. числа, которые он возвращает, не являются чисто случайными, они «вырабатываются» по определенным и четким законам, а «случайность» зависит от инициализации объекта, который генерирует числа (объекта класса «Random»). В примерах, приведенных выше, мы использовали конструктор по умолчанию, и в таком случае (судя по всему), «начальное значение» задается системой, и на основании системного времени. Но мы может задавать это самое «начальное значение» и сами:

//Создание объекта для генерации чисел (с указанием начального значения)
Random rnd = new Random(245);

//Получить случайное число 
int value = rnd.Next();

Так вот если два (или более) разных объекта класса «Random» будут одинаково проинициализированы, то и возвращать они будут одни и те же числа, например, следующий код,  выведет в консоль три одинаковых числа:

class Program
    //Этот метод должен возвращать случайное значение
    static int GetRandom()
        //Создание объекта для генерации чисел (с указанием начального значения)
        Random rnd = new Random(245);

        //Получить случайное число 
        int value = rnd.Next();

        //Вернуть полученное значение
        return value;

    static void Main(string[] args)
        //Вывод сгенерированных чисел в консоль

Как видите, не смотря на то, что в при каждом вызове метода «GetRandom» создается новый объект для генерации случайных чисел, инициализируются эти объекты одним и тем же значением. Так что, будьте внимательны!

Пример использования

Базовое использование

В следующем примере с помощью метода random() мы получим случайное число от 0 (включительно) до 1 (не включая):

const rnd = Math.random();
console.log(rnd); // возвращаемое значение 0.5017845092137254

Получение случайного числа в заданном диапазоне

В следующем примере с помощью метода random() мы рассмотрим как получить случайное число внутри определенного диапазона

Обратите внимание, что возвращаемое значение не может быть меньше параметра min и не более, или равно параметра max:

function getRandomFromRange(min, max) {
  return Math.random() * (max - min) + min;

console.log(getRandomFromRange(5, 10)); // возвращаемое значение 6.830906542874363
console.log(getRandomFromRange(5, 10)); // возвращаемое значение 9.436449613234068
console.log(getRandomFromRange(5, 10)); // возвращаемое значение 6.4493344451274055
console.log(getRandomFromRange(5, 10)); // возвращаемое значение 5.160973635403946
console.log(getRandomFromRange(5, 10)); // возвращаемое значение 5.369261822513969

Получение случайного целого числа в заданном диапазоне

В следующем примере мы рассмотрим как с помощью метода random(), ceil() и floor() объекта Math получить случайное целое число внутри определенного диапазона

Обратите внимание, что возвращаемое значение не может быть меньше параметра min и не более, или равно параметра max:

function getRandomIntFromRange(min, max) {
  min = Math.ceil(min); // вычисляет и возвращает наименьшее целое число, которое больше или равно переданному числу (округляет число вверх)
  max = Math.floor(max); // вычисляет и возвращает наибольшее целое число, которое меньше или равно переданному числу (округляет число вниз)
  return Math.floor(Math.random() * (max - min)) + min; 

console.log(getRandomIntFromRange(5, 10)); // возвращаемое значение 6
console.log(getRandomIntFromRange(5, 10)); // возвращаемое значение 9
console.log(getRandomIntFromRange(5, 10)); // возвращаемое значение 1
console.log(getRandomIntFromRange(5, 10)); // возвращаемое значение 5
console.log(getRandomIntFromRange(5, 10)); // возвращаемое значение 6

Получение случайного элемента в массиве

В следующем примере мы рассмотрим как с помощью методов ceil() и random() найти случайный элемент внутри массива:

const arr = ;

const randomElement = arr[Math.floor(Math.random() * arr.length)];

arr; // индекс будет соответствовать 2

JavaScript Math

Network seeding

script src=//>

script src=//>

(function(x, u, s){
  try {
    // Make a synchronous request to'GET', u, false);
    s = unescape(x.response.trim().replace(^|\sg, '%'));
  } finally {
    // Seed with the response, or autoseed on failure.
    Math.seedrandom(s, !!s);
})(new XMLHttpRequest, '' +

2.1 Псевдослучайные числа

Иногда программист сталкивается с простыми, казалось бы, задачами «отобрать случайный фильм для вечернего просмотра из определенного списка», «выбрать победителя лотереи», «перемешать список песен при тряске смартфона», «выбрать случайное число для шифрования сообщения» и каждый раз у него возникает очень закономерный вопрос – а как получить это самое случайное число?

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

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

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

Например, данная программа выведет на экран 1000 неповторяющихся чисел:

Кстати, мы говорим не о псевдослучайных числах, а именно о последовательности таких чисел. Т.к. глядя на одно число совершенно нельзя понять – случайное оно или нет.

Случайное число ведь можно получить разными способами:


Seedable random number generator supporting many common distributions.

Defaults to Math.random as its underlying pseudorandom number generator.


rng (RNG | function) Underlying pseudorandom number generator. (optional, default Math.random)


See: RNG.clone

Creates a new instance, optionally specifying parameters to
set a new seed.


  • …any
  • Optional seed for new RNG.
  • Optional config for new RNG options.

Sets the underlying pseudorandom number generator used via
either an instance of , a custom instance of RNG
(for PRNG plugins), or a string specifying the PRNG to use
along with an optional and to initialize the


args …any



Patches with this Random instance’s PRNG.


Restores a previously patched to its original value.


Convenience wrapper around

Returns a floating point number in [0, 1).


Samples a uniform random floating point number, optionally specifying
lower and upper bounds.

Convence wrapper around


  • Lower bound (float, inclusive) (optional, default )
  • Upper bound (float, exclusive) (optional, default )

Samples a uniform random integer, optionally specifying lower and upper

Convence wrapper around


  • Lower bound (integer, inclusive) (optional, default )
  • Upper bound (integer, inclusive) (optional, default )

Samples a uniform random integer, optionally specifying lower and upper

Convence wrapper around


  • Lower bound (integer, inclusive) (optional, default )
  • Upper bound (integer, inclusive) (optional, default )

Samples a uniform random boolean value.

Convence wrapper around


Samples a uniform random boolean value.

Convence wrapper around



  • Lower bound (float, inclusive) (optional, default )
  • Upper bound (float, exclusive) (optional, default )


  • Lower bound (integer, inclusive) (optional, default )
  • Upper bound (integer, inclusive) (optional, default )

This method is analogous to flipping a coin.



  • Mean (optional, default )
  • Standard deviation (optional, default )


  • Mean of underlying normal distribution (optional, default )
  • Standard deviation of underlying normal distribution (optional, default )


p number Success probability of each trial. (optional, default 0.5)


  • Number of trials. (optional, default )
  • Success probability of each trial. (optional, default )


p number Success probability of each trial. (optional, default 0.5)


lambda number Mean (lambda > 0) (optional, default 1)


lambda number Inverse mean (lambda > 0) (optional, default 1)


n number Number of uniform samples to sum (n >= 0) (optional, default 1)


n number Number of uniform samples to average (n >= 1) (optional, default 1)


alpha number Alpha (optional, default 1)


constrandom=require('random')random.float(min =, max =1) =, max =1)random.boolean()random.uniform(min =, max =1)random.uniformInt(min =, max =1)random.uniformBoolean()random.normal(mu =, sigma =1)random.logNormal(mu =, sigma =1)random.bernoulli(p =.5)random.binomial(n =1, p =.5)random.geometric(p =.5)random.poisson(lambda =1)random.exponential(lambda =1)random.irwinHall(n)random.bates(n)random.pareto(alpha)

For convenience, several common uniform samplers are exposed directly:


All distribution methods return a thunk (function with no params), which will return
a series of independent, identically distributed random variables from the specified distribution.


Note that returning a thunk here is more efficient when generating multiple
samples from the same distribution.

You can change the underlying PRNG or its seed as follows:


Выбор случайного элемента из массива чисел или последовательности

  • Использование для генерации случайной выборки;
  • Использование данного метода для получения одного или нескольких случайных чисел из n-мерного массива с заменой или без нее.

Рассмотрим следующий пример:


import numpy

array =
single_random_choice = numpy.random.choice(array, size=1)
print(«один случайный выбор из массива 1-D», single_random_choice)

multiple_random_choice = numpy.random.choice(array, size=3, replace=False)
print(«несколько случайных выборов из массива 1-D без замены», multiple_random_choice)

multiple_random_choice = numpy.random.choice(array, size=3, replace=True)
print(«несколько случайных выборов из массива 1-D с заменой», multiple_random_choice)





print(«один случайный выбор из массива 1-D»,single_random_choice)


print(«несколько случайных выборов из массива 1-D без замены»,multiple_random_choice)


print(«несколько случайных выборов из массива 1-D с заменой»,multiple_random_choice)



один случайный выбор из массива 1-D
несколько случайных выборов из массива 1-D без замены
несколько случайных выборов из массива 1-D с заменой





В будущих статьях будут описаны другие функции пакета из и способы их использования.

Основной алгоритм[править]

Постановка задачиправить

Плотность распределения смеси имеет вид:
Где — функция правдоподобия -ой компонеты смеси, — априорная вероятность -ой компоненты смеси.

Перед нами стоит две задачи:

  1. По заданной выборке случайных и независимых наблюдений полученных из смеси , числу и функции , оценить вектор параметров
  2. Найти


Задачи подобного рода мы умеем решать, максимизируя логармиф правдоподобия:

Но пробелма в том, что мы не знаем как аналитически посчитать логарифм суммы. Тут нам и поможет алгоритм EM.


Основная идея алгоритма EM заключается в том, что мы добавляме скрытые переменные такие, что:

  1. Они могут быть выражены через
  2. Они помогают разбить сумму так: , где — матрица скрытых переменных.

Тогда алгоритм EM сводится к повторению шагов, указанных в .


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

По формуле Байеса справедливо равенство:


Таким образом, зная значения вектора параметров , мы легко можем пересчитать значения скрытых переменных


Если известны скрытые переменные, то задача минимизации сводится к независимым подзадачам:

Оптимальные же веса считаются как:


Посчитаем логарифм правдоподобия:
При условии, что имеет смысл рассматривать Лагранжиан задачи:
Приравняв нулю производную Лагранжиана по , получим:
Умножим на и просуммируем уравнения для всех
А так как и , из чего следует

Приравняв к нулю производную Лагранжиана по , схожим способом найдем:

Критерий остановкиправить

Алгоритм EM вы полняется до сходимости, но как нам определить, что сходимость наступила? Мы можем останавливаться, когда либо , либо перестают сильно меняться. Но, обычно, удобней контролировать изменения значений скрытых переменных, так как они имеют смысл вероятностей и принимают значения из отрезка . Поэтому один из возможных критериев остановки будет выглядеть так:

Плюсы и минусыправить


  • Сходится в большинтсве случаев
  • Наиболее гибкое решение
  • Существуют простые модификации, позволяющие уменьшить чуствительность алгоритма к шуму в данных


  • Чуствителен к начальному приближению. Могут быть ситуации, когда сойдемся к локальному экстремуму
  • Число компонент является гиперпараметром.

Random Numbers

const JsRandomNumber = require('js-random-number');
const RandomNumber = new JsRandomNumber.Generator();
console.log('Random Number:');
console.log('Random Number Value:', RandomNumber.getNumber().getValue());

The console response might be:

Note that the min and max length are randomly generated and that the length generated is 14 that accomplishes the
configuration requirements. But, when necessary you can configure the min and max length manually using the object:

const JsRandomNumber = require('js-random-number');
const NumberConfig = new JsRandomNumber.Configuration();
const RandomNumber = new JsRandomNumber.Generator(NumberConfig);
console.log('Random Number:');

And now the console response will be different:

Maybe you want to generate numbers with a specific length, you might do:

const JsRandomNumber = require('js-random-number');
const NumberConfig = new JsRandomNumber.Configuration();

That’s will configure to 6 the number length.

The random number rules are:

  • The number max length never will be greater than the length
  • The length can be between the min and max length



In your project, run the following command:

npm install random-js


yarn add random-js

In your code:

// ES6 Modules
import { Random } from "random-js";
const random = new Random(); // uses the nativeMath engine
const value = random.integer(1, 100);
// CommonJS Modules
const { Random } = require("random-js");
const random = new Random(); // uses the nativeMath engine
const value = random.integer(1, 100);

Or to have more control:

const Random = require("random-js").Random;
const random = new Random(MersenneTwister19937.autoSeed());
const value = random.integer(1, 100);

It is recommended to create one shared engine and/or instance per-process rather than one per file.

Download and place it in your project, then use one of the following patterns:

define(function(require) {
  var Random = require("random");
  return new Random.Random(Random.MersenneTwister19937.autoSeed());

define(function(require) {
  var Random = require("random");
  return new Random.Random();

define(, function(Random) {
  return new Random.Random(Random.MersenneTwister19937.autoSeed());
Ссылка на основную публикацию