Генератор случайных чисел, который производит распределение закона питания?

HTTP_ORIGIN отправляется не всеми браузерами и не является безопасным.

Ничто, отправленное браузером, не может считаться безопасным.

28
задан Stefan Mai 28 May 2009 в 01:39
поделиться

3 ответа

This page at Wolfram MathWorld discusses how to get a power-law distribution from a uniform distribution (which is what most random number generators provide).

The short answer (derivation at the above link):

x = [(x1^(n+1) - x0^(n+1))*y + x0^(n+1)]^(1/(n+1))

where y is a uniform variate, n is the distribution power, x0 and x1 define the range of the distribution, and x is your power-law distributed variate.

34
ответ дан 28 November 2019 в 02:58
поделиться

Если вы знаете желаемое распределение (называемое функцией распределения вероятностей (PDF)) и правильно нормализовали его, вы можете интегрировать его, чтобы получить функцию совокупного распределения (CDF), а затем инвертировать CDF (если возможно), чтобы получить необходимое преобразование из однородного [0,1] распределения в желаемое.

Итак, вы начинаете с определения желаемого распределения.

P = F(x)

(для x в [ 0,1]), затем интегрируется, чтобы получить

C(y) = \int_0^y F(x) dx

. Если это можно инвертировать, вы получите

y = F^{-1}(C)

Поэтому вызовите rand () и вставьте результат как C в последнюю строку и используйте y.

Этот результат называется фундаментальной теоремой выборки. Это затруднительно из-за требования нормализации и необходимости аналитического инвертирования функции.

В качестве альтернативы вы можете использовать метод отклонения: равномерно задайте число в желаемом диапазоне, затем введите другое число и сравните его с PDF в месте, указанном вашим первым броском. Отклонить, если второй бросок превышает PDF. Как правило, неэффективен для PDF-файлов с большим количеством областей с низкой вероятностью, таких как файлы с длинными хвостами ...

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


Настоящая мерзость здесь в том, что простые x ^ -n распределения ненормализуемы в диапазоне [0,1] , поэтому вы не можете используйте теорему выборки. Попробуйте вместо этого (x + 1) ^ - n ...

Как правило, неэффективен для PDF-файлов с большим количеством областей с низкой вероятностью, таких как файлы с длинными хвостами ...

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


Настоящая мерзость здесь в том, что простые x ^ -n распределения ненормализуемы в диапазоне [0,1] , поэтому вы не можете используйте теорему выборки. Попробуйте вместо этого (x + 1) ^ - n ...

Как правило, неэффективен для PDF-файлов с большим количеством областей с низкой вероятностью, таких как файлы с длинными хвостами ...

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


Настоящая мерзость здесь в том, что простые x ^ -n распределения ненормализуемы в диапазоне [0,1] , поэтому вы не можете используйте теорему выборки. Попробуйте вместо этого (x + 1) ^ - n ...

t используйте теорему выборки. Попробуйте вместо этого (x + 1) ^ - n ...

t используйте теорему выборки. Попробуйте вместо этого (x + 1) ^ - n ...

20
ответ дан 28 November 2019 в 02:58
поделиться

Я не могу комментировать математику, необходимую для получения распределения по степенному закону (в других сообщениях есть предложения), но я бы посоветовал вам ознакомиться со средствами случайных чисел стандартной библиотеки TR1 C ++ в <случайный> . Они предоставляют больше функциональных возможностей, чем std :: rand и std :: srand . Новая система определяет модульный API для генераторов, движков и дистрибутивов и предоставляет набор предустановок.

Включенные предустановки дистрибутива:

  • uniform_int
  • bernoulli_distribution
  • геометрическое_распределение
  • poisson_distribution
  • binomial_distribution
  • uniform_real
  • exponential_distribution
  • normal_distribution
  • gamma_distribution

Когда вы определяете распределение по степенному закону, вы должны иметь возможность подключить его к существующим генераторам и двигателям. В книге The C ++ Standard Library Extensions Пита Беккера есть отличная глава о .

Вот статья о том, как создавать другие дистрибутивы (с примерами для Коши, хи-квадрат, Стьюдента t и Снедекора F)

3
ответ дан 28 November 2019 в 02:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: