HTTP_ORIGIN
отправляется не всеми браузерами и не является безопасным.
Ничто, отправленное браузером, не может считаться безопасным.
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.
Если вы знаете желаемое распределение (называемое функцией распределения вероятностей (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 ...
Промежуточный подход включает инвертирование CDF с помощью грубой силы: вы сохраняете CDF как таблицу поиска и выполняете обратный поиск чтобы получить результат.
Настоящая мерзость здесь в том, что простые x ^ -n
распределения ненормализуемы в диапазоне [0,1]
, поэтому вы не можете используйте теорему выборки. Попробуйте вместо этого (x + 1) ^ - n ...
Промежуточный подход включает инвертирование CDF с помощью грубой силы: вы сохраняете CDF как таблицу поиска и выполняете обратный поиск чтобы получить результат.
Настоящая мерзость здесь в том, что простые x ^ -n
распределения ненормализуемы в диапазоне [0,1]
, поэтому вы не можете используйте теорему выборки. Попробуйте вместо этого (x + 1) ^ - n ...
Я не могу комментировать математику, необходимую для получения распределения по степенному закону (в других сообщениях есть предложения), но я бы посоветовал вам ознакомиться со средствами случайных чисел стандартной библиотеки 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)