Распределение Парето - это распределение вероятностей, которое встречается в природе. У этого есть много специальных свойств, таких как бесконечное среднее. В этом задании вы выведете число, выбранное из этого распределения.
Распределение Парето определяется как большее или равное x
с вероятностью 1/x
, для всех x
большее или равное 1.
Следовательно, число, выбранное из этого распределения, больше или равно 1 с вероятностью 1, больше или равно 2 с вероятностью точно 1/2, больше или равно 3 с вероятностью точно 1/3, больше или равно 11,4 с вероятностью ровно 1 / 11,4 и так далее.
Так как вы выполните выборку этого распределения, ваша программа или функция не будет вводить и выводить случайное число с указанными выше вероятностями. Однако, если ваша программа не полностью соответствует вышеуказанным вероятностям из-за впечатлений с плавающей точкой, это нормально. Смотрите в нижней части задачи для более подробной информации.
(Точнее, это называется распределение Парето с альфа 1 и нижней границей 1)
Вот 10 примеров из этого распределения:
1.1540029602790338
52.86156818209856
3.003306506971116
1.4875532217142287
1.3604286212876546
57.5263129600285
1.3139866916055676
20.25125817471419
2.8105749663695208
1.1528212409680156
Обратите внимание, что 5 из них ниже 2, а 5 выше 2. Поскольку это средний результат, он, конечно, мог бы быть выше или ниже.
Ваш ответ должен быть верным только в пределах вашего типа с плавающей запятой, типа действительного числа или чего-либо еще, что вы используете, но вы должны иметь возможность представлять числа с точностью не менее 3 десятичных цифр и представлять числа до 1 000 000 , Если вы не уверены, что что-то в порядке, не стесняйтесь спрашивать.
Это код гольф.
Подробности о неточности:
Для каждого диапазона
[a, b]
, где1 <= a < b
идеальная вероятность того, что выборка попадет в этот диапазон, равна1/a - 1/b
. Вероятность того, что ваша программа производит ряд в этом диапазоне должна быть с0.001
о1/a - 1/b
. ЕслиX
вывод вашей программы, это требуется|P(a <= X <= b) - (1/a - 1/b)| < 0.001
.Следует отметить , что путем применения вышеуказанного правила с
a=1
иb
достаточно большим, это тот случай, когда программа должна выводить число , большее или равное 1, по меньшей мере вероятностью 0,999. В остальное время может произойти сбой, выводInfinity
или что-то еще.
Я вполне уверен, что существующие представления в форме 1/1-x
или 1/x
, где x
случайное плавание в [0, 1)
или (0, 1)
или [0, 1]
, все удовлетворяют этому требованию.
Ответы:
MATL , 3 байта
Попробуйте онлайн! Или оцените получающиеся вероятности , выполняя это 10000 раз.
объяснение
источник
На самом деле , 4 байта
Попробуйте онлайн!
Объяснение:
источник
R, 10 байт
Довольно просто.
источник
runif
никогда не возвращает 0 или 1 в случае по умолчанию, поэтому проблем с этим нет.runif
дать 1 равна нулю, вероятность1/runif
дать 1 не равна, из-за точности с плавающей запятой ( т.е. обычно 1 / 0.9999999 возвращает 1 в R).TI-Basic, 2 байта
Для всех, кто интересуется,
rand
возвращает случайное значение в (0,1]. "Из-за особенностей алгоритма генерации случайного числа наименьшее число, которое можно сгенерировать, немного больше 0. Наибольшее возможное число на самом деле 1 ... "( источник ). Например, высевающий ранд с 196164532 дает 1.источник
rand
более полезным в качестве подпрограммы для других команд калькулятора, и, вероятно, именно поэтому TI приняла это дизайнерское решение. Например,randNorm(0,1
возвращается-7.02129...
с начальным значением 196164532. Использование алгоритма ГСЧ без корректировки дало бы значение1e99
, которое является необоснованным значением для нормально распределенной переменной.R , 12 байт
Попробуйте онлайн!
Проверьте распределение
Это использует другой подход, используя тот факт, что если
Y~exp(alpha)
, тоX=x_m*e^Y
это Парето с параметрамиx_m,alpha
. Поскольку оба параметра равны 1, а параметр скорости по умолчанию дляrexp
1 равен 1, это приводит к соответствующему распределению Парето.Хотя этот ответ является довольно специфичным для R подходом, он, к сожалению, менее гольфы, чем plannapus » .
R , 14 байтов
Попробуйте онлайн!
Еще меньше гольфа, но другой способ получить ответ.
Другое свойство экспоненциального распределения состоит в том
X ~ Exp(λ) then e^−X ~ Beta(λ, 1)
, что если , следовательно,1/Beta(1,1)
являетсяPareto(1,1)
.Кроме того, увлеченный наблюдатель может вспомнить, что если
X ~ Beta(a,b)
иa=b=1
тогдаX~Unif(0,1)
, то это действительно так1/runif(1)
.источник
actuar::rpareto(1,1,1)
потому что он длиннее :)Древесный уголь , 10 байт
Попробуйте онлайн!
Ссылка на подробную версию:
Комментарии:
1/(1-R)
формула: в этом случае N устанавливается равным 1000000, так как ОП запрашивает минимальное значение. Чтобы получить это число, Charcoal предоставляет заданную переменнуюf
= 1000. Так что вычисленияf^2
мы получаем 1000000. В случае, если случайное число 999999 (максимум),1/(1-0.999999)=1000000
.1/(1-R/N)
гдеR
случайное число между 0 и N, это то же самое, что просто вычислитьN/(N-R)
. Но учитывая, что случайные целые числаN-R
иR
имеют одинаковую вероятность появления, это то же самое, что и просто вычислениеN/R
(R
в этом последнем случае число от 1 до N включительно, чтобы избежать деления на ноль).источник
MapAssignRight
, 10 байтов! работает.Haskell ,
6156 байтФункция
randomIO :: IO Float
генерирует случайные числа в интервале[0,1)
, поэтому преобразование их с использованиемx -> 1/(1-x)
приведет к реализации Парето.Попробуйте онлайн!
источник
randomIO>>=print.((1::Float)/)
main=
.[0,1)
соответствует этому ответуExcel, 9 байт
Да, Excel (полу) конкурентоспособен за изменения!
источник
=1/Rand(
)Mathematica, 10 байт
Попробуйте онлайн!
-4 байта от М.Штерна
источник
RandomReal
выводит действительное число в закрытом диапазоне[0, 1]
. Таким образом, деление на 0 возможно. Вам нужно будет манипулировать случайным значением, чтобы удалить эту возможность.the burden of proof should be on the person claiming to have a valid answer
вы должны доказать, что оно действительно, а не просить @Mego предоставить неверный контрольный пример. Кроме того, поскольку float дискретен, вероятность получить 0 не равна нулю.$MinMachineNumber
. Попробуйте это:Table[RandomReal[{0, $MinMachineNumber}], 100]
. Оказывается, Mathematica достаточно умен, чтобы отказаться от номеров машин и перейти к числам произвольной точности. СМЕШНО.Рубин,
148 байтТривиальная программа, я не думаю, что она может стать короче.
источник
Excel VBA, 6 байт
Функция анонимного непосредственного окна VBE, которая не требует ввода и вывода в непосредственное окно VBE
источник
Python , 41 байт
Попробуйте онлайн!
Использование встроенного на самом деле дольше:
Python , 43 байта
Попробуйте онлайн!
Оба решения работают как в Python 2, так и в Python 3.
источник
print
сохраняет байт.J , 5 байт
Как это работает:
?0
генерирует случайное значение больше 0 и меньше 1-.
вычесть из 1%
обоюдныйПопробуйте онлайн!
источник
Красный , 19 байт
Попробуйте онлайн!
источник
APL (Dyalog) , 5 байтов
Попробуйте онлайн!
Как?
источник
Japt , 6 байт
1/1-Mr
такой же длины, но это было немного менее скучно!Попытайся
объяснение
Увеличиваем (
°
) ноль (T
) и делим на (/
) его абсолютную разницу (a
) сMath.random()
.источник
Желе , 5 байт
Желе также не имеет случайного числа с плавающей точкой, так что это использует
x/n
, гдеx
это случайное число в диапазоне[1, n]
(включительно) для имитации случайного поплавка в диапазоне(0, 1]
. В этой программеn
установлено быть .108
Попробуйте онлайн!
объяснение
Подключить , 3 байта
Попробуйте онлайн!
Подключить бьет желе! (TI-Basic еще нет)
объяснение
Конечно, это имеет ненулевую вероятность принять обратное значение 0.
источник
ØX
вернется0
ли решение Enlist, если вернется ? (Отказ от ответственности: я не знаю, Записаться на всех!)your program must output a number greater than or equal to 1 with at least probability 0.999. The rest of the time it may crash
(из правилIBM / Lotus Notes Formula, 13 байтов
Образец (10 прогонов)
источник
Java 8,
2218 байт(Старый ответ до изменения правил:
v->1/(1-Math.random())
)Попробуй это здесь.
источник
JavaScript REPL, 15
19байтисточник
Math.random()
вернет 01/(1-Math.random())
?_=>
с самого начала сделать это функцией; фрагменты не допускаются.Пыть , 2 байта
Объяснение:
Попробуйте онлайн!
источник
J, 9 байт
Я не мог понять, как сделать так, чтобы это не занимало ввода, так как p =:%? 0 оценивал бы сразу и оставался фиксированным. Из-за этого это своего рода долго.
Как это работает:
Оценивается 20 раз:
источник
Pyth , 4 байта
Попробуй это здесь!
Альтернатива:
c1h_O0
.источник
c1tOZ
5, не работает?1-n
не нужноn-1
100
?100
AFAIKЧисто , 91 байт
Чистый не любит случайных чисел.
Поскольку генератору случайных чисел (Mersenne Twister) нужно дать начальное число, мне нужно взять системную временную метку, чтобы получить что-то, что отличается пассивно для каждого прогона, и для выполнения всего, что связано с IO, мне нужно использовать целое
Start
объявление, потому что это Единственное место для полученияWorld
.Попробуйте онлайн!
источник