Вибірка розподілу Парето


22

Розподіл Парето є розподіл ймовірностей , що приходить багато в природі. Він має безліч спеціальних властивостей, таких як нескінченне середнє. У цьому виклику ви виведете число, відібране з цього розподілу.

Розподіл Парето визначається як більший або рівний 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], все задовольняють цю вимогу.



2
Зауважте всім: issacg додав деякі правила, які дозволяють зробити певні неточності, тому більшість відповідей тут довші, ніж потрібно. [Вибачте за зловживання коментарями, але це те, що станеться, коли питання про зміну ОП значно зміниться]
user202729

Відповіді:


6

MATL , 3 байти

1r/

Спробуйте в Інтернеті! Або оцініть отримані ймовірності, виконавши її 10000 разів.

Пояснення

1    % Push 1
r    % Push random number uniformly distributed on the open interval (0,1)
/    % Divide. Implicitly display

Після роз'яснення та редагування в ОП ця відповідь відповідає правилам виклику
Луїс Мендо


5

R, 10 байт

1/runif(1)

Досить прямо.


2
Зауважте, що runif ніколи не повертає 0 або 1 у випадку за замовчуванням, тому проблем з цим немає.
Джузеппе

Так дякую. І я не думав про це, вводячи цю відповідь, але ви дійсно можете перевірити розподіл, якщо потрібно.
планнапус

2
@Mego це неправильно. Розподіл Парето абсолютно безперервний і, таким чином, має міру 0 для будь-якого числа.
Теркель

3
@ Mee ОК, що може бути моїм спортом (враховуючи, що я знаю, що майже нічого не знає про плаваючу крапку), але я насправді думаю, що хоча ймовірність runifдати 1 є нульовою, ймовірність 1/runifдати 1 ні, через точність плаваючої крапки ( тобто зазвичай 1 / 0,9999999 повертає 1 в R).
планнапус

1
@plannapus Хм ... Це хороший момент. Поплавці роблять це зовсім надто складно.
Мего

4

TI-Basic, 2 байти

rand^-1      (AB 0C in hex)

Для всіх, хто цікавиться, randповертає випадкове значення в (0,1]. "Завдяки специфіці алгоритму генерування випадкових чисел найменше число, яке можливо генерувати, трохи перевищує 0. Найбільше можливе число - це насправді 1 ... "( джерело ). Наприклад, насіннєвий насінник з 196164532 дає урожай 1.


Як не дивно, еквівалентний код не працює на калькуляторі серії TI-89. Незважаючи на те, що їх генератори випадкових чисел майже однаково реалізовані, TI-89 поверне 0, коли TI-83 + поверне 0,99999999999889.
Міша Лавров

2
Розробники TI-Basic заздалегідь знали, що ця проблема стане ...? Здається, цього разу переможеш.
користувач202729

@ user202729 Уникання 0 і 1 стає randбільш корисним як підпрограма для інших команд калькулятора, тому, ймовірно, TI прийняв таке дизайнерське рішення. Наприклад, randNorm(0,1повернення -7.02129...з початковим кодом 196164532. Використання алгоритму RNG без коригування дало б значення 1e99, яке є необґрунтованим значенням для нормально розподіленої змінної.
Міша Лавров

@ user202729 Так, насправді я просто трохи подорожував, щоб все це зробити. Безумовно, варто для цих результатів.
Timtech

4

R , 12 байт

exp(rexp(1))

Спробуйте в Інтернеті!

Перевірте розподіл

Для цього потрібен інший підхід, використовуючи той факт, що якщо Y~exp(alpha), тоді X=x_m*e^Yє Парето з параметрами x_m,alpha. Оскільки обидва параметри дорівнюють 1, а параметр швидкості за замовчуванням rexpдорівнює 1, це призводить до відповідного розподілу Парето.

Хоча ця відповідь є досить R-специфічним підходом, він, на жаль, менш гострий, ніж планнапус " .

R , 14 байт

1/rbeta(1,1,1)

Спробуйте в Інтернеті!

Ще менш гофрований, але інший спосіб отримати відповідь.

Ще одна властивість експоненціального розподілу полягає в тому, що якщо X ~ Exp(λ) then e^−X ~ Beta(λ, 1), отже, 1/Beta(1,1)це a Pareto(1,1).

Крім того, пильний спостерігач нагадує, що якщо X ~ Beta(a,b)і a=b=1тоді X~Unif(0,1), тоді це справді так 1/runif(1).


Я поняття не маю. Але насправді існує величезна плутанина щодо того, що дозволено, а що не на цьому виклику.
користувач202729

@ user202729 це справедливо, але ті, хто висловлює занепокоєння з цього приводу, принаймні, прокоментували б, так що зниження подій (на мій погляд) навряд чи пов'язане з цим. EDIT: таємниця downvoter видалила downvote.
Джузеппе

Я прихильнився, тому що вважав, що використання R для такого виклику, як це було тривіально, але я був трохи задоволений тригером. Я усвідомлюю, що для цього використовується інший метод, ніж більшість інших відповідей, тому я зняв свій голос.
KSmarts

@KSmarts "Тривіальну" відповідь на R фактично ніхто не використовував: actuar::rpareto(1,1,1)тому що це довше :)
plannapus

Для інформації, є близько. 20 дистрибутивів, жорстко закодованих в базі R, але Pareto не є однією з них, отже, потрібно або використовувати обхідний або додатковий пакет.
планнапус

3

Вугілля деревне , 10 байт

I∕Xφ²⊕‽Xφ²

Спробуйте в Інтернеті!

Посилання на багатослівну версію:

Print(Cast(Divide(Power(f, 2), ++(Random(Power(f, 2))))));

Коментарі:

  • У вугіллі є тільки методи отримання випадкових цілих чисел, тому для отримання випадкового числа з плаваючою комою між 0 і 1 нам потрібно отримати випадкове ціле число між 0 і N і ділити на N.
  • Попередня версія цієї відповіді, що використовувала 1/(1-R)формулу: У цьому випадку N встановлюється на 1000000, оскільки ОП вимагає, щоб він був мінімальним. Щоб отримати це число, вугілля забезпечує задану змінну f= 1000. Так що обчислення f^2ми отримуємо 1000000. У разі, якщо випадкове число 999999 (максимум), 1/(1-0.999999)=1000000.
  • Порада Ніла (збереження 3 байтів): Якщо у мене 1/(1-R/N)де Rвипадкове число між 0 і N, це те саме, що просто обчислити N/(N-R). Але , з огляду на , що випадкові числа N-Rі Rмають однакову ймовірність статися, тобто такий же , як тільки обчислення N/R(будучи Rв цьому останньому випадку число в діапазоні від 1 до N включно , щоб уникнути поділу на нуль).


@Neil, будь ласка, почекайте хвилинку, коли я намагаюся зрозуміти, що робить ваш код ... :-)
Чарлі

На насправді мені не потрібно MapAssignRightбільше ніяких, 10 байт! працює.
Ніл

@Нейл асиміляція вашого коду завершена! Відповідь відредаговано. :-D
Чарлі

3

Haskell , 61 56 байт

Функція randomIO :: IO Floatвиробляє випадкові числа в інтервалі [0,1) , тому перетворення їх за допомогою x -> 1/(1-x)вироблятиме реалізацію парето.

import System.Random
randomIO>>=print.(1/).((1::Float)-)

Спробуйте в Інтернеті!


Переміщення анотації типу економить кілька байтів:randomIO>>=print.((1::Float)/)
Laikoni

Оскільки функції дозволені, я б сказав, що ви можете скинути main=.
Лайконі

Очевидно, діапазон [0,1)відповідає цій відповіді
недолік

@flawr Whoops, ти маєш рацію! Я забув, як поплавці працюють тимчасово.
Мего

Ну все одно, дякую за коментар, я б і не мав ідеї :)
дефект

3

Excel, 9 байт

=1/rand()

Так, Excel є (напів-) конкурентоспроможним за зміну!


Також працює у LibreOffice Calc :)
ElPedro

Ви можете змінити це на аркушах google на -1 Байт ( =1/Rand()
Тейлор Скотт

3

Математика, 10 байт

1/Random[]

Спробуйте в Інтернеті!

-4 байти від M.Stern


2
Це може призвести до RandomRealвиходу з ладу, оскільки виводить реальне число у закритому діапазоні [0, 1]. Таким чином, можливий поділ на 0. Вам потрібно буде маніпулювати випадковим значенням, щоб усунути цю можливість.
Мего

2
@Mego, де саме ти знайшов цю інформацію?
J42161217

1
@Mego, яка ймовірність отримати 0?
J42161217

4
Jenny_mathy: Відповідно до пропозиції щодо мета, the burden of proof should be on the person claiming to have a valid answer- це ваша робота, щоб довести, що це дійсно, а не просити @Mego надати недійсний тестовий випадок. Також тому, що поплавці дискретні, ймовірність отримати 0 не є нульовою.
користувач202729

1
Повертаючись до теми, я не вірю, що існує можливість отримати нуль за допомогою цієї функції. Фактично Mathematica дасть числа менші, ніж $MinMachineNumber. Спробуйте це: Table[RandomReal[{0, $MinMachineNumber}], 100]. Виявляється, Mathematica досить розумний, щоб відмовитися від машинних чисел і перейти на довільні точні числа. ЛОЛ.
Келлі Лоудер

2

Рубін, 14 8 байт

p 1/rand

Тривіальна програма, я не думаю, що вона може бути коротшою.


Зауважте всім: issacg додав деякі правила, які дозволяють зробити певні неточності, тому більшість відповідей тут довші, ніж потрібно.
user202729

2

Excel VBA, 6 байт

Анонімна функція негайного вікна VBE, яка не приймає вводу та виводить у безпосереднє вікно VBE

?1/Rnd

1

Пітон , 41 байт

lambda:1/(1-random())
from random import*

Спробуйте в Інтернеті!


Використання вбудованого насправді довше:

Пітон , 43 байти

lambda:paretovariate(1)
from random import*

Спробуйте в Інтернеті!

Обидва рішення працюють як в Python 2, так і в Python 3.


1
Повні програми коротші для завдань, які не використовують введення, за допомогою printекономії байта.
Ерік Аутгольфер

1

J , 5 байт

%-.?0

Як працює:

?0 генерує випадкове значення, що перевищує 0 і менше 1

-. відняти від 1

% зворотний

Спробуйте в Інтернеті!


Зауважте всім: issacg додав деякі правила, які дозволяють зробити певні неточності, тому більшість відповідей тут довші, ніж потрібно.
користувач202729



1

Japt , 6 байт

1/1-Mr однакова довжина, але це відчувалося трохи менш нудно!

°T/aMr

Спробуй це


Пояснення

Приріст ( °) нуль ( T) і ділимо на ( /) його абсолютну різницю ( a) на Math.random().


Зауважте всім: issacg додав деякі правила, які дозволяють зробити певні неточності, тому більшість відповідей тут довші, ніж потрібно.
користувач202729

1

Желе , 5 байт

Желе також не має випадкове поплавок, тому тут використовується , x/nде xце випадкове число в діапазоні [1, n](включно) для імітації випадкового поплавка в діапазоні (0, 1]. У цій програмі nвстановлено, що буде .108

ȷ8µ÷X

Спробуйте в Інтернеті!

Пояснення

ȷ8     Literal 10^8.
  µ    New monad.
   ÷   Divide by
    X  random integer.

Список , 3 байти

ØXİ

Спробуйте в Інтернеті!

Рекрут б'є желе! (TI-Basic ще немає)

Пояснення

  İ    The inverse of...
ØX     a random float in [0, 1)

Звичайно, це має ненульову ймовірність прийняти зворотну 0.


Чи не вдалося б завершити рішення Enlist, якщо його ØXповернуть 0? (Відмова: Я взагалі не знаю зарахування!)
Shaggy

@Shaggy 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(з правил виклику)
користувач202729

1

Формула IBM / Lotus Notes, 13 байт

1/(1-@Random)

Зразок (10 циклів)

введіть тут опис зображення


Зауважте всім: issacg додав деякі правила, які дозволяють зробити певні неточності, тому більшість відповідей тут довші, ніж потрібно.
користувач202729

Не впевнений, що я міг би зробити це набагато коротше, незалежно від зміни правил :)
ElPedro


1

JavaScript REPL, 15 19 байт

1/Math.random()

3
Це не дасть правильних результатів, якщо Math.random() повернеться 0
містер Xcoder

1
Напевно 1/(1-Math.random())?
користувач202729

Виправлено за допомогою рішення u * 29
l4m2

Вам потрібно _=>на початку зробити цю функцію; фрагменти заборонені.
Кудлатий

Це повна програма з використанням консолі
l4m2


0

J, 9 байт

p=:%@?@0:

Я не міг зрозуміти, як змусити його не вводити дані, оскільки p =:%? 0 оцінюється негайно та залишається фіксованим. Через це свого роду довго.

Як це працює:

p=:        | Define the verb p
       0:  | Constant function. Returns 0 regardless of input.
     ?@    | When applied to 0, returns a random float in the range (0,1)
   %@      | Reciprocal

Оцінено 20 разів:

    p"0 i.20
1.27056 1.86233 1.05387 16.8991 5.77882 3.42535 12.8681 17.4852 2.09133 1.82233 2.28139 1.58133 1.79701 1.09794 1.18695 1.07028 3.38721 2.88339 2.06632 2.0793

0

Pyth , 4 байти

c1O0

Спробуйте тут!

Альтернатива: c1h_O0.


c1tOZ5, це не працює?
Дейв

@Dave Не працює, повертає негативні значення. Мені 1-nне потрібноn-1
містер Xcoder

Хіба Pyth не має константи для 100?
Кудлатий

@Shaggy Я б хотів, щоб це було. На жаль, жодна константа для 100AFAIK
містер Xcoder

0

Чисто , 91 байт

import StdEnv,Math.Random,System.Time
Start w=1.0/(1.0-hd(genRandReal(toInt(fst(time w)))))

Очистити не подобаються випадкові числа.

Оскільки випадковому генератору (Mersenne Twister) потрібно дати насіння, я повинен взяти системну мітку часу, щоб отримати щось, що пасивно відрізняється на пробіг, і щоб робити все, що стосується IO, мені потрібно використовувати цілу Startдекларацію, оскільки це тільки місце для отриманняWorld .

Спробуйте в Інтернеті!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.