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 x
dengan probabilitas 1/x
, untuk semua x
lebih 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 mana1 <= a < b
, probabilitas ideal bahwa sampel akan jatuh dalam kisaran itu adalah1/a - 1/b
. Probabilitas bahwa program Anda menghasilkan angka dalam kisaran itu harus dengan0.001
dari1/a - 1/b
. JikaX
merupakan 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=1
danb
cukup besar, program Anda harus mengeluarkan angka yang lebih besar atau sama dengan 1 dengan setidaknya probabilitas 0,999. Sisa waktu itu mungkin macet, keluaranInfinity
, atau melakukan apa pun.
Saya cukup yakin bahwa pengiriman formulir yang ada 1/1-x
atau 1/x
, di mana x
mengambang acak di [0, 1)
atau (0, 1)
atau [0, 1]
, semua memenuhi persyaratan ini.
Jawaban:
MATL , 3 byte
Cobalah online!Atau perkirakan probabilitas yang dihasilkan dengan menjalankannya 10.000 kali.
Penjelasan
sumber
Sebenarnya , 4 byte
Cobalah online!
Penjelasan:
sumber
R, 10 byte
Cukup mudah.
sumber
runif
tidak pernah mengembalikan 0 atau 1 dalam kasus default sehingga tidak ada masalah dengan ini.runif
memberi 1 adalah nol, probabilitas1/runif
memberi 1 tidak, karena akurasi floating point ( yaitu biasanya 1 / 0,9999999 mengembalikan 1 dalam R).TI-Basic, 2 byte
Bagi siapa pun yang bertanya-tanya,
rand
mengembalikan 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.sumber
rand
lebih berguna sebagai subrutin untuk perintah kalkulator lainnya, yang mungkin mengapa TI membuat keputusan desain ini. Misalnya,randNorm(0,1
kembali-7.02129...
dengan seed 196164532. Menggunakan algoritma RNG tanpa penyesuaian akan memberikan nilai1e99
, yang merupakan nilai yang tidak masuk akal untuk dimiliki oleh variabel yang berdistribusi normal.R , 12 byte
Cobalah online!
Verifikasi distribusinya
Ini mengambil pendekatan yang berbeda, mengeksploitasi fakta bahwa jika
Y~exp(alpha)
, makaX=x_m*e^Y
Pareto dengan parameterx_m,alpha
. Karena kedua parameter adalah 1, dan parameter laju default untukrexp
adalah 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
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)
, maka1/Beta(1,1)
aPareto(1,1)
.Selain itu, seorang pengamat yang tajam akan ingat bahwa jika
X ~ Beta(a,b)
dana=b=1
, makaX~Unif(0,1)
, jadi ini benar-benar1/runif(1)
.sumber
actuar::rpareto(1,1,1)
Arang , 10 byte
Cobalah online!
Tautan adalah ke versi verbose:
Komentar:
1/(1-R)
rumus: Dalam hal ini, N diatur ke 1000000 karena OP memintanya sebagai minimum. Untuk mendapatkan nomor ini, Arang menyediakan variabel presetf
= 1000. Jadi hanya menghitungf^2
kita mendapatkan 1000000. Jika angka acaknya adalah 999999 (maksimum)1/(1-0.999999)=1000000
,.1/(1-R/N)
manaR
angka acak antara 0 dan N, itu sama dengan hanya menghitungN/(N-R)
. Tetapi mengingat bahwa bilangan bulat acakN-R
danR
memiliki probabilitas yang sama terjadi, itu sama dengan hanya menghitungN/R
(R
dalam kasus terakhir ini angka antara 1 dan N termasuk untuk menghindari pembagian dengan nol).sumber
MapAssignRight
lagi, 10 byte! bekerja.Haskell ,
6156 byteFungsi
randomIO :: IO Float
menghasilkan angka acak dalam interval[0,1)
, jadi mentransformasikannya menggunakanx -> 1/(1-x)
akan menghasilkan realisasi pareto.Cobalah online!
sumber
randomIO>>=print.((1::Float)/)
main=
.[0,1)
sesuai dengan jawaban iniExcel, 9 byte
Ya, Excel (semi-) kompetitif untuk perubahan!
sumber
=1/Rand(
)Mathematica, 10 byte
Cobalah online!
-4 byte dari M.Stern
sumber
RandomReal
menghasilkan bilangan real dalam kisaran tertutup[0, 1]
. Dengan demikian, pembagian dengan 0 dimungkinkan. Anda harus memanipulasi nilai acak untuk menghapus kemungkinan itu.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.$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.Ruby,
148 byteProgram sepele, saya pikir itu tidak bisa lebih pendek.
sumber
Excel VBA, 6 Bytes
Fungsi jendela langsung VBE anonim yang tidak mengambil input dan output ke jendela langsung VBE
sumber
Python , 41 byte
Cobalah online!
Menggunakan builtin sebenarnya lebih lama:
Python , 43 byte
Cobalah online!
Kedua solusi bekerja di Python 2 dan Python 3.
sumber
print
menghemat satu byte.J , 5 byte
Cara kerja:
?0
menghasilkan nilai acak lebih besar dari 0 dan kurang dari 1-.
kurangi dari 1%
timbal-balikCobalah online!
sumber
Merah , 19 byte
Cobalah online!
sumber
APL (Dyalog) , 5 byte
Cobalah online!
Bagaimana?
sumber
Japt , 6 byte
1/1-Mr
memiliki panjang yang sama tetapi ini terasa sedikit kurang membosankan!Cobalah
Penjelasan
Increment (
°
) zero (T
) dan bagi dengan (/
) perbedaan absolut (a
) denganMath.random()
.sumber
Jelly , 5 byte
Jelly juga tidak memiliki float acak, jadi ini menggunakan
x/n
manax
bilangan bulat acak dalam rentang[1, n]
(inklusif) untuk meniru float acak dalam jangkauan(0, 1]
. Dalam programn
ini diatur menjadi .108
Cobalah online!
Penjelasan
Mintalah , 3 byte
Cobalah online!
Mintalah mengalahkan Jelly! (TI-Dasar belum)
Penjelasan
Tentu saja ini memiliki probabilitas nol untuk mengambil kebalikan dari 0.
sumber
ØX
dikembalikan0
? (Penafian: Saya tidak tahu Daftar sama sekali!)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)Formula IBM / Lotus Notes, 13 byte
Sampel (10 berjalan)
sumber
Java 8,
2218 byte(Jawaban lama sebelum aturan berubah:
v->1/(1-Math.random())
)Coba di sini.
sumber
JavaScript REPL, 15
19bytesumber
Math.random()
mengembalikan 01/(1-Math.random())
?_=>
di awal untuk membuat ini berfungsi; cuplikan tidak diizinkan.Pyt , 2 byte
Penjelasan:
Cobalah online!
sumber
J, 9 Bytes
Saya tidak tahu bagaimana cara membuatnya tanpa input, karena p =:%? 0 akan mengevaluasi segera dan tetap diperbaiki. Karena ini agak lama.
Bagaimana itu bekerja:
Dievaluasi 20 kali:
sumber
Pyth , 4 byte
Coba di sini!
Alternatif:
c1h_O0
.sumber
c1tOZ
adalah 5, apakah itu tidak berfungsi?1-n
tidak perlun-1
100
?100
AFAIKBersih , 91 byte
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
Start
deklarasi karena itu adalah hanya tempat untuk mendapatkan aWorld
.Cobalah online!
sumber