Lấy mẫu phân phối Pareto


22

Các phân phối Pareto là một phân bố xác suất mà đi lên rất nhiều trong tự nhiên. Nó có rất nhiều tính chất đặc biệt, chẳng hạn như một ý nghĩa vô hạn. Trong thử thách này, bạn sẽ xuất ra một số được lấy mẫu từ phân phối này.

Phân phối Pareto được xác định là lớn hơn hoặc bằng xvới xác suất 1/x, cho tất cả xlớn hơn hoặc bằng 1.

Do đó, một số được lấy mẫu từ phân phối này lớn hơn hoặc bằng 1 với xác suất 1, lớn hơn hoặc bằng 2 với xác suất chính xác là 1/2, lớn hơn hoặc bằng 3 với xác suất chính xác là 1/3, lớn hơn hoặc bằng 11.4 với xác suất chính xác là 1 / 11.4, v.v.

Vì bạn sẽ lấy mẫu phân phối này, chương trình hoặc chức năng của bạn sẽ không có đầu vào và xuất ra một số ngẫu nhiên, với các xác suất ở trên. Tuy nhiên, nếu chương trình của bạn không hoàn toàn khớp với các xác suất trên do ấn tượng dấu phẩy động thì không sao. Xem phần dưới cùng của thử thách để biết thêm chi tiết.

(Chính xác, đây được gọi là Phân phối Pareto với alpha 1 và giới hạn dưới 1)

Dưới đây là 10 ví dụ rút ra từ bản phân phối này:

1.1540029602790338
52.86156818209856
3.003306506971116
1.4875532217142287
1.3604286212876546
57.5263129600285
1.3139866916055676
20.25125817471419
2.8105749663695208
1.1528212409680156

Lưu ý rằng 5 trong số chúng dưới 2 và 5 trên 2. Vì đây là kết quả trung bình, tất nhiên nó có thể cao hơn hoặc thấp hơn.

Câu trả lời của bạn chỉ cần chính xác đến giới hạn của loại dấu phẩy động, loại số thực hoặc bất cứ thứ gì bạn sử dụng, nhưng bạn phải có thể biểu thị các số ít nhất 3 chữ số thập phân chính xác và đại diện cho các số lên tới 1.000.000 . Nếu bạn không chắc chắn liệu có gì đó ổn không, vui lòng hỏi.

Đây là mã golf.


Chi tiết về sự thiếu chính xác:

  • Đối với mỗi phạm vi [a, b], ở đâu 1 <= a < b, xác suất lý tưởng mà mẫu sẽ nằm trong phạm vi đó là 1/a - 1/b. Xác suất mà chương trình của bạn tạo ra một số trong phạm vi đó phải có 0.001của 1/a - 1/b. Nếu Xlà đầu ra của chương trình của bạn, nó được yêu cầu đó |P(a <= X <= b) - (1/a - 1/b)| < 0.001.

  • Lưu ý rằng bằng cách áp dụng quy tắc trên với a=1bđủ lớn, đó là trường hợp chương trình của bạn phải xuất ra một số lớn hơn hoặc bằng 1 với ít nhất xác suất 0,999. Thời gian còn lại nó có thể bị sập, đầu ra Infinityhoặc làm bất cứ điều gì khác.

Tôi khá chắc chắn rằng tài liệu đệ trình hiện có của hình thức 1/1-xhay 1/x, nơi xlà một float ngẫu nhiên trong [0, 1)hay (0, 1)hay [0, 1], tất cả các đáp ứng yêu cầu này.



2
Lưu ý cho mọi người: issacg đã thêm một số quy tắc cho phép một số quy định, do đó hầu hết các câu trả lời ở đây dài hơn mức cần thiết. [xin lỗi vì lạm dụng bình luận quá, nhưng đó là điều sẽ xảy ra khi OP thay đổi câu hỏi đáng kể]
user202729 16/12/17

Câu trả lời:




5

R, 10 byte

1/runif(1)

Khá đơn giản.


2
Lưu ý rằng runif không bao giờ trả về 0 hoặc 1 trong trường hợp mặc định vì vậy không có vấn đề gì với điều này.
Giuseppe

Vâng cảm ơn. Và tôi đã không nghĩ về nó khi nhập câu trả lời này nhưng bạn thực sự có thể xác minh phân phối nếu cần.
plannapus

2
@Mego không đúng. Phân phối Pareto hoàn toàn liên tục và do đó có số đo 0 cho bất kỳ số nào.
Therkel

3
@Mego OK có thể là nhanh chóng đối với tôi (vì tôi không biết gì về điểm nổi), nhưng tôi thực sự nghĩ rằng trong khi xác suất runifcho 1 là không, thì xác suất 1/runifcho 1 là không, vì độ chính xác của dấu phẩy động ( tức là thông thường 1 / 0.9999999 trả về 1 trong R).
plannapus

1
@plannapus Hmm ... Đó là một điểm tốt. Phao làm cho điều này hoàn toàn quá phức tạp.
Mego

4

TI-Basic, 2 byte

rand^-1      (AB 0C in hex)

Đối với bất kỳ ai thắc mắc, randtrả về một giá trị ngẫu nhiên trong (0,1]. "Do đặc thù của thuật toán tạo số ngẫu nhiên, số nhỏ nhất có thể tạo ra hơi lớn hơn 0. Số lớn nhất có thể thực sự là 1 ... "( Nguồn ). Ví dụ, rand seeding với 196164532 mang lại 1.


Thật kỳ lạ, mã tương đương sẽ không hoạt động trên máy tính sê-ri TI-89. Mặc dù các trình tạo số ngẫu nhiên của chúng gần như được triển khai giống hệt nhau, TI-89 sẽ trả về 0 bất cứ khi nào TI-83 + trả về 0,99999999999889.
Misha Lavrov

2
Các nhà phát triển TI-Basic biết trước thách thức này sẽ xảy ra ...? Nó dường như để giành chiến thắng lần này.
dùng202729

@ user202729 Tránh 0 và 1 randcó ích hơn khi làm chương trình con cho các lệnh khác của máy tính, đó có thể là lý do TI đưa ra quyết định thiết kế này. Ví dụ, randNorm(0,1trả về -7.02129...với seed 196164532. Sử dụng thuật toán RNG mà không cần điều chỉnh sẽ cho một giá trị 1e99, đó là một giá trị không hợp lý cho một biến phân phối thông thường cần có.
Misha Lavrov

@ user202729 Vâng, thực sự tôi chỉ du hành thời gian một chút để hoàn thành mọi việc. Chắc chắn giá trị nó cho những upvote này.
Timtech

4

R , 12 byte

exp(rexp(1))

Hãy thử trực tuyến!

Xác nhận phân phối

Điều này có một cách tiếp cận khác, khai thác thực tế là nếu Y~exp(alpha), sau đóX=x_m*e^Y là một Pareto với các tham số x_m,alpha. Vì cả hai tham số là 1 và tham số tỷ lệ mặc định cho rexplà 1, điều này dẫn đến phân phối Pareto thích hợp.

Mặc dù câu trả lời này là một cách tiếp cận khá cụ thể R, nhưng thật đáng buồn là ít chơi golf hơn plannapus ' .

R , 14 byte

1/rbeta(1,1,1)

Hãy thử trực tuyến!

Thậm chí ít chơi golf, nhưng một cách khác để có được câu trả lời.

Một thuộc tính khác của phân bố mũ là nếu X ~ Exp(λ) then e^−X ~ Beta(λ, 1), do đó, 1/Beta(1,1)là mộtPareto(1,1) .

Ngoài ra, một người quan sát sắc sảo sẽ nhớ lại rằng nếu X ~ Beta(a,b)a=b=1sau đó X~Unif(0,1), thì đây thực sự là 1/runif(1).


Tôi không có ý kiến. Nhưng thực tế là, có một sự nhầm lẫn lớn về những gì được phép và những gì không có trong thử thách này.
dùng202729

@ user202729 thật công bằng, nhưng những người đang gây lo ngại về điều đó ít nhất sẽ có nhận xét, vì vậy, downvote (theo tôi) không có khả năng liên quan đến điều đó. EDIT: downvoter bí ẩn đã loại bỏ downvote.
Giuseppe

Tôi thất vọng vì tôi nghĩ rằng việc sử dụng R cho một thử thách như thế này là chuyện nhỏ, nhưng tôi có một chút vui mừng. Tôi nhận ra rằng điều này sử dụng một phương pháp khác với hầu hết các câu trả lời khác, vì vậy tôi đã loại bỏ downvote của mình.
KSmarts

@KSmarts Câu trả lời "tầm thường" trong R thực sự không được sử dụng bởi bất kỳ ai: actuar::rpareto(1,1,1)vì nó dài hơn :)
plannapus

Để biết thông tin, có ca. 20 bản phân phối được mã hóa cứng trong cơ sở R, nhưng Pareto không phải là một trong số chúng, do đó cần phải sử dụng gói công việc hoặc gói bổ sung.
plannapus

3

Than , 10 byte

I∕Xφ²⊕‽Xφ²

Hãy thử trực tuyến!

Liên kết là phiên bản dài dòng:

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

Bình luận:

  • Than chỉ có các phương thức để lấy số nguyên ngẫu nhiên, vì vậy để có được số dấu phẩy động ngẫu nhiên trong khoảng từ 0 đến 1, chúng ta phải lấy một số nguyên ngẫu nhiên trong khoảng từ 0 đến N và chia cho N.
  • Phiên bản trước của câu trả lời này đã sử dụng 1/(1-R)công thức: Trong trường hợp này, N được đặt thành 1000000 khi OP yêu cầu nó là mức tối thiểu. Để có được số này, Than cung cấp một biến đặt trước f= 1000. Vì vậy, chỉ cần tính toán, f^2chúng tôi nhận được 1000000. Trong trường hợp số ngẫu nhiên là 999999 (tối đa) , 1/(1-0.999999)=1000000.
  • Neil của mũi (tiết kiệm 3 byte): Nếu tôi có 1/(1-R/N)nơi Rlà một số ngẫu nhiên giữa 0 và N, nó cũng giống như chỉ tính toán N/(N-R). Nhưng xem xét rằng các số nguyên ngẫu nhiên N-RRcó cùng xác suất xảy ra, điều đó giống như chỉ tính toán N/R( Rtrong trường hợp cuối cùng này, một số nằm trong khoảng từ 1 đến N để tránh chia cho 0).


@Neil vui lòng đợi một lát trong khi tôi cố gắng hiểu mã của bạn làm gì ... :-)
Charlie

Thật ra tôi không cần MapAssignRightthêm 10 byte nữa! công trinh.
Neil

@Neil đồng hóa mã của bạn đã hoàn thành! Trả lời chỉnh sửa. :-D
Charlie

3

Haskell , 61 56 byte

Hàm randomIO :: IO Floattạo ra các số ngẫu nhiên trong khoảng [0,1) , do đó, việc chuyển đổi chúng bằng cách sử dụng x -> 1/(1-x)sẽ tạo ra các thực hiện pareto.

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

Hãy thử trực tuyến!


Di chuyển chú thích loại sẽ tiết kiệm một vài byte:randomIO>>=print.((1::Float)/)
Laikoni

Và khi các chức năng được cho phép, tôi muốn nói rằng bạn có thể bỏ qua main=.
Laikoni

Có vẻ như phạm vi là [0,1)theo câu trả lời này
flawr

@flawr Rất tiếc, bạn nói đúng! Tôi đã quên làm thế nào phao làm việc tạm thời.
Mego

Dù sao, cảm ơn vì đã bình luận, tôi sẽ không có ý kiến ​​gì :)
flawr

3

Excel, 9 byte

=1/rand()

Yay, Excel là (bán) cạnh tranh cho một sự thay đổi!


Cũng hoạt động trong
LibreScript

Bạn có thể thay đổi trang này thành các trang tính google cho -1 Byte ( =1/Rand()
Taylor Scott

3

Toán học, 10 byte

1/Random[]

Hãy thử trực tuyến!

-4 byte từ M.Stern


2
Điều này có khả năng thất bại, vì RandomRealđầu ra một số thực trong phạm vi đóng [0, 1]. Vì vậy, chia cho 0 là có thể. Bạn sẽ cần thao tác với giá trị ngẫu nhiên để loại bỏ khả năng đó.
Mego

2
@Mego chính xác bạn đã tìm thấy thông tin đó ở đâu?
J42161217

1
@Mego xác suất nhận được 0 là bao nhiêu?
J42161217

4
Jenny_mathy: Theo đề xuất trên meta, the burden of proof should be on the person claiming to have a valid answer- đó là công việc của bạn để chứng minh rằng nó hợp lệ, không yêu cầu @Mego cung cấp trường hợp kiểm tra không hợp lệ. Ngoài ra bởi vì float là rời rạc, xác suất để có được 0 là khác không.
dùng202729

1
Quay lại chủ đề, tôi không tin có khả năng nhận được số 0 khi sử dụng chức năng này. Mathematica trên thực tế sẽ sản xuất số lượng ít hơn $MinMachineNumber. Hãy thử điều này : Table[RandomReal[{0, $MinMachineNumber}], 100]. Hóa ra Mathematica đủ thông minh để từ bỏ số máy và chuyển sang số chính xác tùy ý. LOL.
Kelly Lowder

2

Ruby, 14 8 byte

p 1/rand

Chương trình tầm thường, tôi không nghĩ nó có thể rút ngắn được nữa.


Lưu ý cho mọi người: issacg đã thêm một số quy tắc cho phép một số quy định, do đó hầu hết các câu trả lời ở đây dài hơn mức cần thiết.
dùng202729

2

VBA Excel, 6 byte

Chức năng cửa sổ ngay lập tức VBE ẩn danh không có đầu vào và đầu ra cho cửa sổ ngay lập tức VBE

?1/Rnd


1

J , 5 byte

%-.?0

Làm thế nào ot hoạt động:

?0 tạo ra một giá trị ngẫu nhiên lớn hơn 0 và nhỏ hơn 1

-. trừ đi 1

% đối ứng

Hãy thử trực tuyến!


Lưu ý cho mọi người: issacg đã thêm một số quy tắc cho phép một số quy định, do đó hầu hết các câu trả lời ở đây dài hơn mức cần thiết.
dùng202729



1

Japt , 6 byte

1/1-Mr là cùng một chiều dài nhưng điều này cảm thấy một chút nhàm chán!

°T/aMr

Thử nó


Giải trình

Tăng ( °) zero ( T) và chia cho ( /) sự khác biệt tuyệt đối của nó ( a) với Math.random().


Lưu ý cho mọi người: issacg đã thêm một số quy tắc cho phép một số quy định, do đó hầu hết các câu trả lời ở đây dài hơn mức cần thiết.
dùng202729

1

Thạch , 5 byte

Jelly cũng không có float ngẫu nhiên, do đó, sử dụng x/ntrong đó xmột số nguyên ngẫu nhiên trong phạm vi[1, n] (bao gồm) để mô phỏng một float ngẫu nhiên trong phạm vi (0, 1]. Trong chương trình nnày được thiết lập để được .108

ȷ8µ÷X

Hãy thử trực tuyến!

Giải trình

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

Nhập ngũ , 3 byte

ØXİ

Hãy thử trực tuyến!

Tranh thủ đập Jelly! (TI-Basic chưa)

Giải trình

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

Tất nhiên điều này có xác suất khác không là nghịch đảo của 0.


Giải pháp Enlist sẽ không thất bại nếu được ØXtrả lại 0? (Tuyên bố miễn trừ trách nhiệm: Tôi hoàn toàn không biết Enlist!)
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(từ các quy tắc thử thách)
user202729 17/12/17

1

Công thức ghi chú IBM / Lotus, 13 byte

1/(1-@Random)

Mẫu (10 lần chạy)

nhập mô tả hình ảnh ở đây


Lưu ý cho mọi người: issacg đã thêm một số quy tắc cho phép một số quy định, do đó hầu hết các câu trả lời ở đây dài hơn mức cần thiết.
dùng202729

Không chắc chắn tôi có thể thực hiện việc này ngắn hơn nhiều bất kể thay đổi quy tắc nào được thực hiện :)
ElPedro


1

JavaScript REPL, 15 19 byte

1/Math.random()

3
Điều này sẽ không mang lại kết quả chính xác nếu Math.random() trả về 0
Ông Xcoder

1
Có lẽ 1/(1-Math.random())vậy?
dùng202729

Đã sửa lỗi sử dụng giải pháp của u * 29
l4m2

Bạn cần _=>lúc bắt đầu để làm cho điều này một chức năng; đoạn trích không được phép.
Xù xì

Đây là một chương trình đầy đủ sử dụng bảng điều khiển đang chạy
l4m2


0

J, 9 byte

p=:%@?@0:

Tôi không thể tìm ra cách làm cho nó không mất đầu vào, vì p =:%? 0 sẽ đánh giá ngay lập tức và vẫn cố định. Bởi vì điều này loại dài.

Làm thế nào nó hoạt động:

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

Đánh giá 20 lần:

    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

Dọn dẹp , 91 byte

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

Sạch sẽ không giống như số ngẫu nhiên.

Bởi vì trình tạo ngẫu nhiên (một Mersenne Twister) cần được cung cấp hạt giống, tôi phải lấy dấu thời gian của hệ thống để có được thứ gì đó khác nhau mỗi lần chạy và để làm bất cứ điều gì liên quan đến IO, tôi cần sử dụng toàn bộ Startkhai báo vì đó là nơi duy nhất để có được a World.

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.