Cicipi Distribusi Pareto


22

The Pareto Distribution adalah distribusi probabilitas yang muncul banyak di alam. Ini memiliki banyak properti khusus, seperti rata-rata tak terbatas. Dalam tantangan ini, Anda akan menampilkan sejumlah sampel dari distribusi ini.

Distribusi Pareto didefinisikan lebih besar dari atau sama dengan xdengan probabilitas 1/x, untuk semua xlebih besar dari atau sama dengan 1.

Oleh karena itu, jumlah sampel dari distribusi ini lebih besar dari atau sama dengan 1 dengan probabilitas 1, lebih besar dari atau sama dengan 2 dengan probabilitas tepat 1/2, lebih besar dari atau sama dengan 3 dengan probabilitas tepat 1/3, lebih besar dari atau sama dengan 11,4 dengan probabilitas tepat 1 / 11,4, dan seterusnya.

Karena Anda akan mencicipi distribusi ini, program atau fungsi Anda tidak akan mengambil input, dan menghasilkan angka acak, dengan probabilitas di atas. Namun, jika program Anda tidak cocok dengan probabilitas di atas karena kesan floating-point, tidak apa-apa. Lihat bagian bawah tantangan untuk lebih jelasnya.

(Ini disebut Distribusi Pareto dengan alpha 1 dan batas bawah 1, tepatnya)

Berikut 10 contoh gambar dari distribusi ini:

1.1540029602790338
52.86156818209856
3.003306506971116
1.4875532217142287
1.3604286212876546
57.5263129600285
1.3139866916055676
20.25125817471419
2.8105749663695208
1.1528212409680156

Perhatikan bagaimana 5 dari mereka di bawah 2, dan 5 di atas 2. Karena ini adalah hasil rata-rata, tentu saja bisa lebih tinggi atau lebih rendah.

Jawaban Anda hanya perlu benar hingga batas jenis titik apung Anda, jenis bilangan real, atau apa pun yang Anda gunakan, tetapi Anda harus dapat mewakili angka setidaknya 3 digit desimal presisi, dan mewakili angka hingga 1.000.000 . Jika Anda tidak yakin apakah sesuatu baik-baik saja, jangan ragu untuk bertanya.

Ini kode golf.


Detail tentang ketidaktepatan:

  • Untuk setiap rentang [a, b], di mana 1 <= a < b, probabilitas ideal bahwa sampel akan jatuh dalam kisaran itu adalah 1/a - 1/b. Probabilitas bahwa program Anda menghasilkan angka dalam kisaran itu harus dengan 0.001dari 1/a - 1/b. Jika Xmerupakan output dari program Anda, maka diharuskan demikian |P(a <= X <= b) - (1/a - 1/b)| < 0.001.

  • Perhatikan bahwa dengan menerapkan aturan di atas dengan a=1dan bcukup besar, program Anda harus mengeluarkan angka yang lebih besar atau sama dengan 1 dengan setidaknya probabilitas 0,999. Sisa waktu itu mungkin macet, keluaran Infinity, atau melakukan apa pun.

Saya cukup yakin bahwa pengiriman formulir yang ada 1/1-xatau 1/x, di mana xmengambang acak di [0, 1)atau (0, 1)atau [0, 1], semua memenuhi persyaratan ini.



2
Catatan untuk semua orang: issacg telah menambahkan beberapa aturan yang memungkinkan beberapa ketidaktepatan, oleh karena itu sebagian besar jawaban di sini lebih panjang dari yang diperlukan. [maaf atas penyalahgunaan komentar juga, tapi itulah yang akan terjadi ketika OP mengubah pertanyaan secara signifikan]
user202729

Jawaban:




5

R, 10 byte

1/runif(1)

Cukup mudah.


2
Perhatikan bahwa runif tidak pernah mengembalikan 0 atau 1 dalam kasus default sehingga tidak ada masalah dengan ini.
Giuseppe

Ya terima kasih. Dan saya tidak memikirkannya ketika memasukkan jawaban ini tetapi Anda memang dapat memverifikasi distribusi jika diperlukan.
plannapus

2
@Mego itu tidak benar. Distribusi Pareto benar-benar kontinu dan dengan demikian memiliki ukuran 0 untuk angka apa pun.
Therkel

3
@Mego OK itu mungkin pasir hisap bagi saya (mengingat saya tahu hampir tidak ada tentang floating point), tetapi saya benar-benar berpikir bahwa sementara probabilitas runifmemberi 1 adalah nol, probabilitas 1/runifmemberi 1 tidak, karena akurasi floating point ( yaitu biasanya 1 / 0,9999999 mengembalikan 1 dalam R).
plannapus

1
@plannapus Hmm ... Itu poin yang bagus. Mengapung membuat ini terlalu rumit.
Mego

4

TI-Basic, 2 byte

rand^-1      (AB 0C in hex)

Bagi siapa pun yang bertanya-tanya, randmengembalikan nilai acak dalam (0,1). "Karena spesifik dari algoritma penghasil angka acak, jumlah terkecil yang mungkin dihasilkan sedikit lebih besar dari 0. Angka terbesar yang mungkin sebenarnya adalah 1 ... "( sumber ). Misalnya, menabur rand dengan 196164532 menghasilkan 1.


Anehnya, kode yang setara tidak akan berfungsi pada kalkulator seri TI-89. Meskipun generator angka acak mereka hampir diimplementasikan secara identik, sebuah TI-89 akan mengembalikan 0 setiap kali TI-83 + akan mengembalikan 0,99999999999889.
Misha Lavrov

2
Pengembang TI-Basic tahu sebelumnya bahwa tantangan ini akan terjadi ...? Tampaknya menang kali ini.
user202729

@ user202729 Menghindari 0 dan 1 membuat randlebih berguna sebagai subrutin untuk perintah kalkulator lainnya, yang mungkin mengapa TI membuat keputusan desain ini. Misalnya, randNorm(0,1kembali -7.02129...dengan seed 196164532. Menggunakan algoritma RNG tanpa penyesuaian akan memberikan nilai 1e99, yang merupakan nilai yang tidak masuk akal untuk dimiliki oleh variabel yang berdistribusi normal.
Misha Lavrov

@ user202729 Ya, sebenarnya saya hanya bepergian sedikit waktu untuk menyelesaikan semuanya. Pasti layak untuk upvotes ini.
Timtech

4

R , 12 byte

exp(rexp(1))

Cobalah online!

Verifikasi distribusinya

Ini mengambil pendekatan yang berbeda, mengeksploitasi fakta bahwa jika Y~exp(alpha), maka X=x_m*e^YPareto dengan parameter x_m,alpha. Karena kedua parameter adalah 1, dan parameter laju default untuk rexpadalah 1, ini menghasilkan distribusi Pareto yang sesuai.

Walaupun jawaban ini adalah pendekatan yang cukup spesifik untuk R, namun sayangnya kurang golf daripada plannapus ' .

R , 14 byte

1/rbeta(1,1,1)

Cobalah online!

Bahkan kurang golf, tetapi cara lain untuk mendapatkan jawabannya.

Properti lain dari distribusi eksponensial adalah bahwa jika X ~ Exp(λ) then e^−X ~ Beta(λ, 1), maka 1/Beta(1,1)a Pareto(1,1).

Selain itu, seorang pengamat yang tajam akan ingat bahwa jika X ~ Beta(a,b)dan a=b=1, maka X~Unif(0,1), jadi ini benar-benar 1/runif(1).


Saya tidak punya ide. Tetapi kenyataannya adalah, ada kebingungan besar tentang apa yang diizinkan dan apa yang tidak ada dalam tantangan ini.
user202729

@ user202729 itu adil, tetapi mereka yang telah mengajukan keprihatinan sehubungan dengan hal itu setidaknya akan berkomentar, jadi downvote (menurut saya) tidak mungkin terkait dengan itu. EDIT: misteri downvoter telah menghapus downvote.
Giuseppe

Saya downvoted karena saya pikir menggunakan R pada tantangan seperti ini sepele, tetapi saya sedikit pemicu-senang. Saya menyadari bahwa ini menggunakan metode yang berbeda dari sebagian besar jawaban lainnya, jadi saya menghapus downvote saya.
KSmarts

@KSmarts Jawaban "sepele" dalam R sebenarnya tidak digunakan oleh siapa pun actuar::rpareto(1,1,1)
:,

Untuk info, ada ca. 20 distribusi hard-coded di basis R, tetapi Pareto bukan salah satu dari mereka, maka kebutuhan untuk menggunakan paket work-around atau tambahan.
plannapus

3

Arang , 10 byte

I∕Xφ²⊕‽Xφ²

Cobalah online!

Tautan adalah ke versi verbose:

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

Komentar:

  • Arang hanya memiliki metode untuk mendapatkan bilangan integer acak, jadi untuk mendapatkan bilangan floating-point acak antara 0 dan 1 kita harus mendapatkan bilangan bulat acak antara 0 dan N dan dibagi dengan N.
  • Versi sebelumnya dari jawaban ini yang menggunakan 1/(1-R)rumus: Dalam hal ini, N diatur ke 1000000 karena OP memintanya sebagai minimum. Untuk mendapatkan nomor ini, Arang menyediakan variabel preset f= 1000. Jadi hanya menghitung f^2kita mendapatkan 1000000. Jika angka acaknya adalah 999999 (maksimum) 1/(1-0.999999)=1000000,.
  • Tip Neil (menghemat 3 byte): Jika saya memiliki di 1/(1-R/N)mana Rangka acak antara 0 dan N, itu sama dengan hanya menghitung N/(N-R). Tetapi mengingat bahwa bilangan bulat acak N-Rdan Rmemiliki probabilitas yang sama terjadi, itu sama dengan hanya menghitung N/R( Rdalam kasus terakhir ini angka antara 1 dan N termasuk untuk menghindari pembagian dengan nol).


@Neil tolong tunggu sebentar sementara saya mencoba untuk memahami apa kode Anda ... :-)
Charlie

Sebenarnya saya tidak perlu MapAssignRightlagi, 10 byte! bekerja.
Neil

@Neil asimilasi kode Anda selesai! Jawaban diedit. :-D
Charlie

3

Haskell , 61 56 byte

Fungsi randomIO :: IO Floatmenghasilkan angka acak dalam interval [0,1) , jadi mentransformasikannya menggunakan x -> 1/(1-x)akan menghasilkan realisasi pareto.

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

Cobalah online!


Memindahkan anotasi jenis menghemat beberapa byte:randomIO>>=print.((1::Float)/)
Laikoni

Dan karena fungsi diizinkan, saya katakan Anda dapat menghapus main=.
Laikoni

Mungkin kisarannya [0,1)sesuai dengan jawaban ini
flawr

@ flawr Ups, kau benar! Saya lupa bagaimana mengapung bekerja sementara.
Mego

Yah, terima kasih sudah berkomentar, saya tidak akan punya ide :)
flawr

3

Excel, 9 byte

=1/rand()

Ya, Excel (semi-) kompetitif untuk perubahan!


Juga bekerja di LibreOffice Calc :)
ElPedro

Anda dapat mengubahnya ke lembar google untuk -1 Bytes ( =1/Rand()
Taylor Scott

3

Mathematica, 10 byte

1/Random[]

Cobalah online!

-4 byte dari M.Stern


2
Ini berpotensi gagal, karena RandomRealmenghasilkan bilangan real dalam kisaran tertutup [0, 1]. Dengan demikian, pembagian dengan 0 dimungkinkan. Anda harus memanipulasi nilai acak untuk menghapus kemungkinan itu.
Mego

2
@Mego di mana tepatnya Anda menemukan info itu?
J42161217

1
@Mego, berapa probabilitas untuk mendapatkan 0?
J42161217

4
Jenny_mathy: Menurut proposal tentang meta, the burden of proof should be on the person claiming to have a valid answer- adalah tugas Anda untuk membuktikan bahwa itu valid, bukan untuk meminta @Mego memberikan kasus uji yang tidak valid. Juga karena float diskrit, probabilitas untuk mendapatkan 0 adalah nol.
user202729

1
Kembali ke topik, saya tidak percaya ada kemungkinan mendapatkan nol menggunakan fungsi ini. Mathematica sebenarnya akan menghasilkan angka kurang dari $MinMachineNumber. Coba ini: Table[RandomReal[{0, $MinMachineNumber}], 100]. Ternyata Mathematica cukup pintar untuk meninggalkan nomor mesin dan beralih ke angka presisi yang berubah-ubah. LOL.
Kelly Lowder

2

Ruby, 14 8 byte

p 1/rand

Program sepele, saya pikir itu tidak bisa lebih pendek.


Catatan untuk semua orang: issacg telah menambahkan beberapa aturan yang memungkinkan beberapa ketidaktepatan, oleh karena itu sebagian besar jawaban di sini lebih panjang dari yang diperlukan.
user202729

2

Excel VBA, 6 Bytes

Fungsi jendela langsung VBE anonim yang tidak mengambil input dan output ke jendela langsung VBE

?1/Rnd

1

Python , 41 byte

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

Cobalah online!


Menggunakan builtin sebenarnya lebih lama:

Python , 43 byte

lambda:paretovariate(1)
from random import*

Cobalah online!

Kedua solusi bekerja di Python 2 dan Python 3.


1
Program lengkap lebih pendek untuk tugas-tugas yang tidak menggunakan input, menggunakan printmenghemat satu byte.
Erik the Outgolfer

1

J , 5 byte

%-.?0

Cara kerja:

?0 menghasilkan nilai acak lebih besar dari 0 dan kurang dari 1

-. kurangi dari 1

% timbal-balik

Cobalah online!


Catatan untuk semua orang: issacg telah menambahkan beberapa aturan yang memungkinkan beberapa ketidaktepatan, oleh karena itu sebagian besar jawaban di sini lebih panjang dari yang diperlukan.
user202729

1

Merah , 19 byte

1 /(1 - random 1.0)

Cobalah online!


Catatan untuk semua orang: issacg telah menambahkan beberapa aturan yang memungkinkan beberapa ketidaktepatan, oleh karena itu sebagian besar jawaban di sini lebih panjang dari yang diperlukan.
user202729

1

APL (Dyalog) , 5 byte

÷1-?0

Cobalah online!

Bagaimana?

 ÷   1-     ?0
1÷  (1-  random 0..1)

Catatan untuk semua orang: issacg telah menambahkan beberapa aturan yang memungkinkan beberapa ketidaktepatan, oleh karena itu sebagian besar jawaban di sini lebih panjang dari yang diperlukan.
user202729

1

Japt , 6 byte

1/1-Mr memiliki panjang yang sama tetapi ini terasa sedikit kurang membosankan!

°T/aMr

Cobalah


Penjelasan

Increment ( °) zero ( T) dan bagi dengan ( /) perbedaan absolut ( a) dengan Math.random().


Catatan untuk semua orang: issacg telah menambahkan beberapa aturan yang memungkinkan beberapa ketidaktepatan, oleh karena itu sebagian besar jawaban di sini lebih panjang dari yang diperlukan.
user202729

1

Jelly , 5 byte

Jelly juga tidak memiliki float acak, jadi ini menggunakan x/nmana xbilangan bulat acak dalam rentang [1, n](inklusif) untuk meniru float acak dalam jangkauan (0, 1]. Dalam program nini diatur menjadi .108

ȷ8µ÷X

Cobalah online!

Penjelasan

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

Mintalah , 3 byte

ØXİ

Cobalah online!

Mintalah mengalahkan Jelly! (TI-Dasar belum)

Penjelasan

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

Tentu saja ini memiliki probabilitas nol untuk mengambil kebalikan dari 0.


Apakah solusi Daftar tidak gagal jika ØXdikembalikan 0? (Penafian: Saya tidak tahu Daftar sama sekali!)
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(dari aturan tantangan)
user202729

1

Formula IBM / Lotus Notes, 13 byte

1/(1-@Random)

Sampel (10 berjalan)

masukkan deskripsi gambar di sini


Catatan untuk semua orang: issacg telah menambahkan beberapa aturan yang memungkinkan beberapa ketidaktepatan, oleh karena itu sebagian besar jawaban di sini lebih panjang dari yang diperlukan.
user202729

Tidak yakin saya bisa membuat ini jauh lebih pendek apa pun perubahan aturan dibuat :)
ElPedro


1

JavaScript REPL, 15 19 byte

1/Math.random()

3
Ini tidak akan menghasilkan hasil yang benar jika Math.random() mengembalikan 0
Tn. Xcoder

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

Tetap menggunakan solusi u * 29
l4m2

Anda perlu _=>di awal untuk membuat ini berfungsi; cuplikan tidak diizinkan.
Shaggy

Ini adalah program lengkap menggunakan konsol yang sedang berjalan
l4m2


0

J, 9 Bytes

p=:%@?@0:

Saya tidak tahu bagaimana cara membuatnya tanpa input, karena p =:%? 0 akan mengevaluasi segera dan tetap diperbaiki. Karena ini agak lama.

Bagaimana itu bekerja:

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

Dievaluasi 20 kali:

    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 byte

c1O0

Coba di sini!

Alternatif: c1h_O0.


c1tOZadalah 5, apakah itu tidak berfungsi?
Dave

@Dave Tidak berfungsi, yang mengembalikan nilai negatif. Saya 1-ntidak perlun-1
Tn. Xcoder

Apakah Pyth tidak memiliki konstanta untuk 100?
Shaggy

@ Shaggy Saya berharap itu terjadi. Sayangnya, tidak ada konstanta untuk 100AFAIK
Tn. Xcoder

0

Bersih , 91 byte

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

Bersih tidak suka nomor acak.

Karena generator acak (sebuah Mersenne Twister) perlu diberi sebuah seed, saya harus mengambil stempel waktu sistem untuk mendapatkan sesuatu yang berbeda secara pasif per-run, dan untuk melakukan apa pun yang berhubungan dengan IO, saya perlu menggunakan seluruh Startdeklarasi karena itu adalah hanya tempat untuk mendapatkan a World.

Cobalah online!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.