파레토 분포 표본 추출


22

파레토 분포는 자연을 많이 온다 확률 분포이다. 무한 평균과 같은 많은 특수 속성이 있습니다. 이 문제에서는이 분포에서 샘플링 한 숫자를 출력합니다.

파레토 분포와 동일하거나보다 큰 것으로 정의되는 x확률로 1/x모두, x1 이상의.

따라서이 분포에서 샘플링 된 수는 확률 1의 경우 1보다 크거나 같고, 정확히 1/2의 확률로 2보다 크거나 같고, 확률이 정확히 1/3 인 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.0011/a - 1/b. X프로그램의 출력 인 경우 다음이 필요합니다 |P(a <= X <= b) - (1/a - 1/b)| < 0.001.

  • 위의 규칙을 적용 a=1하고 b충분히 크게 적용하면 프로그램에서 0.999 이상의 확률로 1 이상의 숫자를 출력해야합니다. 나머지 시간은 충돌, 출력 Infinity또는 기타 다른 작업을 수행 할 수 있습니다.

나는 형태의 기존 제출하는 것이 매우 확신 1/1-x하거나 1/x, x임의의 부동입니다 [0, 1)이나 (0, 1)또는 [0, 1]이 모든 요구 사항을 만족.



2
모든 사람들에게 참고 : issacg는 약간의 부정확성을 허용하는 규칙을 추가했습니다. 따라서 대부분의 답변은 필요 이상입니다. [댓글 남용에 대해서도 죄송합니다. 그러나 OP 변경 질문이 크게 발생하면 어떻게
됩니까?

답변:




5

R, 10 바이트

1/runif(1)

꽤 직설적 인.


2
참고 runif 결코 기본 경우 0 또는 1을 반환 이에 문제가되지 않도록.
주세페

예, 고마워요 그리고이 답변을 입력 할 때 그것을 생각하지 못했지만 실제로 필요한 경우 분포를 확인할 수 있습니다 .
plannapus

2
@ 메고 맞지 않습니다. 파레토 분포는 절대적으로 연속적이므로 숫자에 대해 측정 값이 0입니다.
Therkel

3
@Mego OK 저에게 빠를 수도 있습니다 (부동 소수점에 대해서는 아무것도 알지 못했지만) 실제로 runif1 1/runif을 줄 확률은 null이지만 1을 줄 확률 은 부동 소수점 정확도 때문에 그렇지 않다고 생각합니다 ( 즉, 일반적으로 1 / 0.9999999는 R에서 1을 반환합니다.
plannapus

1
@plannapus 흠 ... 좋은 지적입니다. 플로트는 이것을 너무 복잡하게 만듭니다.
Mego

4

TI 기본, 2 바이트

rand^-1      (AB 0C in hex)

궁금한 사람은 rand(0,1]에 임의의 값을 반환합니다. "임의의 숫자 생성 알고리즘의 특성상 생성 가능한 최소 숫자는 0보다 약간 큽니다. 가능한 최대 숫자는 실제로 1입니다 ... "( source ). 예를 들어 196164532의 시드 시드는 1을 산출합니다.


이상하게도 동등한 코드는 TI-89 시리즈 계산기에서 작동하지 않습니다. 난수 생성기가 거의 동일하게 구현 되더라도 TI-83 +가 0.99999999999889를 반환 할 때마다 TI-89는 0을 반환합니다.
Misha Lavrov

2
TI-Basic 개발자들은 이러한 도전이 일어날 것이라는 것을 미리 알고있었습니다 ...? 이번에는이기는 것 같습니다.
user202729

@ user202729 0과 1을 피 rand하면 계산기의 다른 명령에 대한 서브 루틴으로 더 유용하므로 TI가이 설계 결정을 한 이유 일 것입니다. 예를 들어, 시드 196164532로 randNorm(0,1리턴 -7.02129...합니다. 조정없이 RNG 알고리즘을 사용하면 값이 1e99일반 분포 변수에 부적합한 값인을 제공합니다 .
Misha Lavrov

@ user202729 예, 실제로는 시간이 조금 다 걸렸습니다. 이러한 공감대에게 확실히 가치가 있습니다.
Timtech

4

R , 12 바이트

exp(rexp(1))

온라인으로 사용해보십시오!

분포 확인

이것은 다른 접근법을 취하며 , 그렇다면 파라미터가있는 파레토 라는 사실 을 이용 합니다 . 두 모수는 모두 1이고 기본 속도 모수 는 1이므로 적절한 파레토 분포가됩니다.Y~exp(alpha)X=x_m*e^Yx_m,alpharexp

이 대답은 상당히 R- 특정 방식이지만, 그것보다 더 슬픈 덜 golfy의 'plannapus .

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).


나도 몰라 그러나 현실은이 도전에 허용되는 것과 그렇지 않은 것에 대해 큰 혼란이 있다는 것입니다.
user202729

@ user202729 그것은 공평하지만, 그것에 대해 우려를 제기 한 사람들은 적어도 언급했을 것이므로, 공감대는 (내 의견으로는) 관련이 없을 것입니다. 편집 : 미스터리 downvoter가 downvote를 제거했습니다.
주세페

나는 R과 같은 도전에 R을 사용하는 것이 사소한 것이라고 생각했기 때문에 공감했지만, 나는 약간 행복했습니다. 나는 이것이 다른 대부분의 답변과 다른 방법을 사용한다는 것을 알고 있으므로 다운 보트를 제거했습니다.
KSmarts

@KSmarts R의 "사소한"답변은 실제로 아무도 사용하지 않았습니다 : actuar::rpareto(1,1,1), 그것이 더 길기 때문에 :)
plannapus

정보를 위해 ca. 베이스 R에는 하드 코딩 된 20 개의 배포판이 있지만 파레토는 그중 하나가 아니므로 해결 방법이나 추가 패키지를 사용해야합니다.
plannapus

3

, 10 바이트

I∕Xφ²⊕‽Xφ²

온라인으로 사용해보십시오!

자세한 버전으로 연결되는 링크 :

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

코멘트:

  • 숯에는 임의의 정수를 얻는 방법 만 있으므로 0과 1 사이의 임의의 부동 소수점 수를 얻으려면 0과 N 사이의 임의의 정수를 가져 와서 N으로 나눠야합니다.
  • 1/(1-R)수식 을 사용한이 답변의 이전 버전 :이 경우 OP가 최소값을 요구할 때 N이 1000000으로 설정됩니다. 이 숫자를 얻으려면 Charcoal은 사전 설정된 변수 f= 1000을 제공합니다 . 따라서 계산 f^2하면 1000000을 얻습니다. 난수가 999999 (최대 값) 인 경우 1/(1-0.999999)=1000000.
  • (3 바이트를 저장) 닐의 팁 : 만약 내가 1/(1-R/N)어디 R0과 N 사이의 임의의 숫자가, 그냥 계산과 동일합니다 N/(N-R). 그러나 임의의 정수 것을 고려 N-R하고 R단지 계산과 동일 발생할 동일한 확률이 N/R(인 R피 분할 1과 N 사이의 포괄적 수가 0으로 마지막 경우 참조).


@Neil 코드의 기능을 이해하려고 시도하는 동안 잠시 기다려주십시오 ... :-)
Charlie

실제로 나는 MapAssignRight더 이상 10 바이트 가 필요하지 않습니다 ! 공장.
Neil

코드의 @Nil 동화가 완료되었습니다! 답변이 수정되었습니다. :-D
Charlie

3

하스켈 , 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=.
Laikoni

실제로 범위는 이 답변[0,1) 에 따라
flawr

@ flawr Whoops, 당신 말이 맞아요! 수레가 일시적으로 작동하는 방식을 잊었습니다.
Mego

어쨌든, 의견을 주셔서 감사합니다, 나는 전혀 몰랐습니다 :)
flawr

3

엑셀, 9 바이트

=1/rand()

예, Excel은 (반) 경쟁력이 있습니다!


또한 LibreOffice Calc에서 작동 :)
ElPedro

-1 바이트 ( =1/Rand()의 Google 시트로 변경할 수 있습니다.
Taylor Scott

3

Mathematica, 10 바이트

1/Random[]

온라인으로 사용해보십시오!

M.Stern에서 -4 바이트


2
RandomReal닫힌 범위에서 실수를 출력 하기 때문에 실패 할 가능성이 있습니다 [0, 1]. 따라서, 0으로 나누는 것이 가능하다. 그러한 가능성을 제거하려면 임의의 값을 조작해야합니다.
Mego

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에게 잘못된 테스트 사례를 제공하지 말고 그것이 유효한지 증명하는 것이 당신의 일입니다. 또한 float는 이산이기 때문에 0을 얻을 확률은 0이 아닙니다.
user202729

1
주제로 돌아가서이 기능을 사용하여 0을 얻을 가능성이 없다고 생각합니다. Mathematica는 실제로보다 적은 수를 생성합니다 $MinMachineNumber. 이것을 시도하십시오 : Table[RandomReal[{0, $MinMachineNumber}], 100]. Mathematica는 기계 번호를 버리고 임의의 정밀 번호로 전환 할 수있을 정도로 똑똑합니다. LOL.
Kelly Lowder

2

루비, 14 8 바이트

p 1/rand

사소한 프로그램, 나는 그것이 더 짧아 질 수 있다고 생각하지 않습니다.


Note to everyone: issacg has added some rules that allow some imprecisions, therefore most answers here are longer than necessary.
user202729

2

Excel VBA, 6 Bytes

Anonymous VBE immediate window function that takes no input and outputs to the VBE immediate window

?1/Rnd

1

Python, 41 bytes

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

Try it online!


Using the builtin is actually longer:

Python, 43 bytes

lambda:paretovariate(1)
from random import*

Try it online!

Both solutions work in both Python 2 and Python 3.


1
Full programs are shorter for tasks which don't use input, using print saves a byte.
Erik the Outgolfer

1

J, 5 bytes

%-.?0

How ot works:

?0 generates a random value greater than 0 and less than 1

-. subtract from 1

% reciprocal

Try it online!


Note to everyone: issacg has added some rules that allow some imprecisions, therefore most answers here are longer than necessary.
user202729



1

Japt, 6 bytes

1/1-Mr is the same length but this felt a little less boring!

°T/aMr

Try it


Explanation

Increment (°) zero (T) and divide by (/) its absolute difference (a) with Math.random().


Note to everyone: issacg has added some rules that allow some imprecisions, therefore most answers here are longer than necessary.
user202729

1

Jelly, 5 bytes

Jelly also doesn't have random float, so this uses x/n where x is an random integer in range [1, n] (inclusive) to emulate a random float in range (0, 1]. In this program n is set to be 108.

ȷ8µ÷X

Try it online!

Explanation

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

Enlist, 3 bytes

ØXİ

Try it online!

Enlist beats Jelly! (TI-Basic not yet)

Explanation

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

Of course this has nonzero probability of take the inverse of 0.


Would the Enlist solution not fail if ØX returned 0? (Disclaimer: I don't know Enlist at all!)
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 (from the challenge rules)
user202729

1

IBM/Lotus Notes Formula, 13 bytes

1/(1-@Random)

Sample (10 runs)

enter image description here


Note to everyone: issacg has added some rules that allow some imprecisions, therefore most answers here are longer than necessary.
user202729

Not sure I could make this much shorter whatever rule changes are made :)
ElPedro


1

JavaScript REPL, 15 19 bytes

1/Math.random()

3
This will not yield correct results if Math.random() returns 0
Mr. Xcoder

1
Probably 1/(1-Math.random())?
user202729

Fixed using u*29's solution
l4m2

You need _=> at the start to make this a function; snippets aren't allowed.
Shaggy

It's a full program using console running
l4m2


0

J, 9 Bytes

p=:%@?@0:

I couldn't figure out how to make it take no input, since p=:%?0 would evaluate immediately and remain fixed. Because of this its sort of long.

How it works:

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

Evaluated 20 times:

    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

Clean, 91 bytes

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

Clean doesn't like random numbers.

Because the random generator (a Mersenne Twister) needs to be given a seed, I have to take the system timestamp to get something that differs passively per-run, and to do anything IO-related I need to use a whole Start declaration because it's the only place to obtain a World.

Try it online!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.