Pareto Dağıtımı Örneği


22

Pareto Dağılımı doğada çok çıkageldi bir olasılık dağılımıdır. Sonsuz bir ortalama gibi birçok özel özelliğe sahiptir. Bu mücadelede, bu dağıtımdan örneklenen bir sayı çıkacaksınız.

Pareto Dağılımının xolasılık 1/x, x1'den büyük veya 1'e eşit olması olasılığına eşit veya daha büyük olduğu tanımlanır .

Bu nedenle, bu dağılımdan örneklenen bir sayı, olasılık 1 ile 1, büyük, tam olasılık 2 ile büyük veya tam olarak 1/2, eşit olasılık, tam 1/3, büyük veya 1 ile eşit 11.4 olasılıkla tam olarak 1 / 11.4, vb.

Bu dağıtımı örnekleyeceğinizden, programınız veya işleviniz giriş yapmaz ve yukarıdaki olasılıklarla rasgele bir sayı çıkarır. Bununla birlikte, programınız kayan nokta gösterimi nedeniyle yukarıdaki olasılıklarla tam olarak eşleşmiyorsa, sorun değil. Daha fazla ayrıntı için mücadelenin en altına bakın.

(Bu, Pareto Dağılımı ile alfa 1 ve alt sınır 1 ile kesin olarak adlandırılır)

İşte bu dağılımdan 10 örnek:

1.1540029602790338
52.86156818209856
3.003306506971116
1.4875532217142287
1.3604286212876546
57.5263129600285
1.3139866916055676
20.25125817471419
2.8105749663695208
1.1528212409680156

5'in 2'nin altında ve 5'in 2'nin üzerinde olduğuna dikkat edin. Bu ortalama sonuç olduğundan, elbette daha yüksek veya daha düşük olabilirdi.

Cevabınızın yalnızca kayan nokta türünüzün, gerçek sayı türünüzün ya da başka ne kullandığınızın sınırları kadar doğru olması gerekir, ancak sayıları en az 3 ondalık basamağa kadar temsil edebilmeli ve 1.000.000 adede kadar rakamları gösterebilmelisiniz. . Bir şeyin yolunda olup olmadığından emin değilseniz, sormaktan çekinmeyin.

Bu kod golfü.


Hassasiyet hakkında detaylar:

  • Her aralık için [a, b], 1 <= a < bnumunenin bu aralıkta düşeceği ideal olasılıktır 1/a - 1/b. Programınız bu aralıktaki bir sayı üretir olasılık ile olmalıdır 0.001arasında 1/a - 1/b. Eğer Xsenin Programın çıktısı, o gerekmektedir |P(a <= X <= b) - (1/a - 1/b)| < 0.001.

  • Yukarıdaki kuralı uygulayarak a=1ve byeterince büyük uygulayarak, programınızın en az 0,999 olasılıkla 1'den büyük veya 1 sayıya eşit olması gerektiğini unutmayın. Zamanın geri kalanı çökebilir, çıkabilir Infinityveya başka bir şey yapabilir.

Var olan formun 1/1-xya da rastgele bir 1/xyerde ya da ya da tümünün bu gereksinimi karşıladığına eminim .x[0, 1)(0, 1)[0, 1]



2
Herkese not: issacg, bazı kesinsizliklere izin veren bazı kurallar ekledi, bu nedenle buradaki çoğu cevap gerekenden daha uzundur. [yorum kötüye kullanımı için özür dilerim, ancak OP soruyu önemli ölçüde değiştirdiğinde bu olur]
user202729

Yanıtlar:




5

R, 10 bayt

1/runif(1)

Oldukça basit.


2
runif Varsayılan durumda asla 0 veya 1 değerini döndürmediğine dikkat edin, bu nedenle bununla ilgili bir sorun yok.
Giuseppe

Evet teşekkürler. Ve bu cevabı girerken düşünmedim, ancak gerçekten de gerekirse dağıtımı doğrulayabilirsiniz .
plannapus

2
@Mego bu yanlış. Pareto dağılımı kesinlikle süreklidir ve bu nedenle herhangi bir sayı için 0 ölçüsü vardır.
Therkel

3
@Mego OK benim için bataklık olabilir (kayan nokta hakkında hiçbir şeye yakın olduğumu bildiğimden dolayı), ancak aslında runif1 verme olasılığının boş olmasına rağmen, 1 verme olasılığının 1/runifkayan nokta doğruluğu nedeniyle olmadığını düşünüyorum ( yani tipik olarak 1 / 0.9999999, R) 'de 1'i döndürür.
plannapus

1
@ plannapus Hmm ... Bu iyi bir nokta. Şamandıralar, bunu tamamen karmaşık hale getirir.
Mego

4

TI-Basic, 2 bayt

rand^-1      (AB 0C in hex)

Merak eden herkes için, rand(0,1] 'de rastgele bir değer verir. "Rasgele sayı üretme algoritmasının özelliklerine bağlı olarak, üretilebilecek en küçük sayı 0'dan biraz daha büyüktür. Olası en büyük sayı aslında 1 ... "( kaynak ). Örneğin, 196164532 ile rand tohumlama verimi 1 olur.


Garip bir şekilde, eşdeğer kod bir TI-89 serisi hesap makinesinde işe yaramaz. Rastgele sayı üreteçleri neredeyse aynı şekilde uygulanmış olsalar bile, bir TI-83 + 0.99999999999889 değerini döndürdüğünde bir TI-89 0 döndürür.
Misha Lavrov

2
TI-Basic geliştiricileri bu zorluğun olacağını önceden biliyorlardı ...? Bu sefer kazanıyor gibi görünüyor.
user202729 16:17,

@ user202729 0 ve 1'den kaçınmak rand, hesap makinesinin diğer komutları için bir alt rutin olarak daha kullanışlı hale getirir , bu nedenle TI bu tasarım kararını vermesinin nedeni budur. Örneğin, tohum 196164532 ile randNorm(0,1geri döner -7.02129.... Ayarlama olmadan RNG algoritmasının kullanılması, 1e99normal dağılmış bir değişkenin sahip olması için makul olmayan bir değer olan bir değer verir .
Misha Lavrov,

@ user202729 Evet, aslında sadece zaman hepsini almak için biraz seyahat ettim. Bu upvotes için kesinlikle buna değer.
Timtech

4

R , 12 bayt

exp(rexp(1))

Çevrimiçi deneyin!

Dağıtımı doğrula

Bu, farklı bir yaklaşım izler , eğer öyleyse Y~exp(alpha), o zaman X=x_m*e^Yparametreleri olan bir Pareto olduğu gerçeğinden yararlanarakx_m,alpha . Her iki parametre de 1 ve varsayılan değer parametresi rexp1 olduğundan, bu uygun Pareto dağılımına neden olur.

Bu cevap oldukça R'ye özgü bir yaklaşım olsa da, ne yazık ki plannapus'tan daha az golf sahası. .

R , 14 bayt

1/rbeta(1,1,1)

Çevrimiçi deneyin!

Daha az golf sahası, ama cevabı almanın başka bir yolu.

Üstel dağılım başka bir mülkü ki eğer olduğunu X ~ Exp(λ) then e^−X ~ Beta(λ, 1)dolayısıyla 1/Beta(1,1)bir olduğunuPareto(1,1) .

Ayrıca, iyi bir gözlemci eğer hatırlatmak isteriz X ~ Beta(a,b)ve a=b=1ardından X~Unif(0,1), bu nedenle bu gerçekten olduğunu 1/runif(1).


Hiç bir fikrim yok. Ancak gerçek şu ki, neye izin verildiğiyle ve bu mücadelede neyin bulunmadığı konusunda büyük bir karışıklık var.
user202729

@ user202729 bu adil, ancak bununla ilgili endişeleri artıranlar en azından yorumda bulunacaklardı, bu yüzden en önemlisi (bence) bununla ilgili olması muhtemel değil. EDIT: gizem downvoter downvote kaldırıldı.
Giuseppe

Düşürdüm, çünkü R'yi böyle bir zorlukla kullanmanın önemsiz olduğunu düşünmüştüm, ama biraz tetikleyici-mutluydum. Bunun diğer cevapların çoğundan farklı bir yöntem kullandığının farkındayım, bu yüzden aşağı oyumu kaldırdım.
KSmarts

@KSmarts R'deki "önemsiz" cevap aslında kimse tarafından kullanılmadı: actuar::rpareto(1,1,1)çünkü daha uzun çünkü :)
plannapus

Bilgi için ca. R üssünde kodlanmış 20 dağıtım vardır , ancak Pareto bunlardan biri değildir, bu nedenle bir çalışma çevresinde veya ek bir paket kullanma ihtiyacı vardır.
plannapus

3

Kömür , 10 bayt

I∕Xφ²⊕‽Xφ²

Çevrimiçi deneyin!

Bağlantı ayrıntılı versiyona:

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

Yorumlar:

  • Kömürün yalnızca rasgele tamsayı sayıları elde etme yöntemleri vardır, bu nedenle 0 ile 1 arasında rasgele bir kayan nokta sayısı elde etmek için 0 ile N arasında rasgele bir tam sayı elde etmemiz ve N ile bölmemiz gerekir.
  • 1/(1-R)Formülü kullanan bu cevabın önceki versiyonu : Bu durumda, OP minimum olmasını istediğinde N 1000000 olarak ayarlanır. Bu sayıyı almak için Kömür önceden ayarlanmış bir değişken sağlar f= 1000. Yani sadece hesaplama f^21000000 alıyoruz. Rastgele sayının 999999 (en fazla) olması durumunda,1/(1-0.999999)=1000000 ,.
  • (3 bayt tasarruf) Neil ipucu: varsa 1/(1-R/N)burada R0 ile N arasında bir rasgele sayı, bu sadece hesaplamak aynıdır N/(N-R). Ancak rastgele tamsayılar N-Rve Roluşma ihtimalinin aynı olduğu N/Rdüşünülürse R, bu sadece hesaplama ile aynıdır ( bu son durumda sıfıra bölünmeyi önlemek için 1 ile N arasında bir sayı olması).


@Neil, lütfen kodunuzun ne yaptığını anlamaya çalışırken bir dakika bekleyin ... :-)
Charlie

Aslında ihtiyacım yok MapAssignRightartık, 10 bayt! Eserleri.
Neil

@Neil kodunuzun asimilasyonu tamamlandı! Cevap düzenlendi. :-D
Charlie

3

Haskell , 61 56 bayt

İşlev aralık içinderandomIO :: IO Float rasgele sayılar üretir , bu nedenle bunları kullanarak dönüştürmek, pareto gerçekleştirmeleri üretecektir. [0,1)x -> 1/(1-x)

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

Çevrimiçi deneyin!


Tür ek açıklamasını taşımak birkaç bayt kazandırır:randomIO>>=print.((1::Float)/)
Laikoni

Ve fonksiyonlara izin verildiğinden, bunu bırakabileceğinizi söyleyebilirim main=.
Laikoni

Açıkçası aralık bu cevaba[0,1) göre
kusur

@flawr Whoops, haklısın! Yüzenlerin geçici olarak nasıl çalıştığını unuttum.
Mego

Her neyse, yorum yaptığınız için teşekkürler, hiçbir fikrim olmazdı :)
kusur

3

Excel, 9 bayt

=1/rand()

Yay, Excel bir değişim için (yarı) rekabetçi!


Ayrıca LibreOffice
Calc'da

Bunu -1 Bytes ( =1/Rand() için google çarşaf olarak değiştirebilirsiniz
Taylor Scott

3

Mathematica, 10 bayt

1/Random[]

Çevrimiçi deneyin!

M.Stern'ten -4 bayt


2
Bu başarısız olma potansiyeline sahiptir, çünkü RandomRealkapalı aralıkta gerçek bir sayı üretir [0, 1]. Böylece, 0'a bölünmek mümkündür. Bu olasılığı ortadan kaldırmak için rasgele değeri değiştirmeniz gerekir.
Mego,

2
@Mego Bu bilgiyi tam olarak nerede buldun?
J42161217

1
@Mego 0 alma olasılığı nedir?
J42161217

4
Jenny_mathy: Meta önerisine göre the burden of proof should be on the person claiming to have a valid answer- geçerli olduğunu kanıtlamak senin işin @Mego'dan geçersiz bir test davası vermesini istemek değil. Ayrıca şamandıranın ayrık olması nedeniyle 0 alma olasılığı sıfırdır.
user202729

1
Konuya geri dönersek, bu işlevi kullanarak sıfır alma olasılığı olduğuna inanmıyorum. Mathematica aslında daha az sayıda üretecektir $MinMachineNumber. Bu deneyin: Table[RandomReal[{0, $MinMachineNumber}], 100]. Mathematica, makine numaralarından vazgeçecek ve rasgele kesinlikli numaralara geçecek kadar akıllıdır. LOL.
Kelly Lowder

2

Ruby, 14 8 bayt

p 1/rand

Önemsiz bir program, daha kısa süreceğini sanmıyorum.


Herkese not: issacg, bazı kesinsizliklere izin veren bazı kurallar ekledi, bu nedenle buradaki çoğu cevap gerekenden daha uzundur.
user202729

2

Excel VBA, 6 Bayt

Giriş yapmayan ve VBE anlık penceresine çıkış yapan anonim VBE anlık pencere işlevi

?1/Rnd

1

Python , 41 bayt

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

Çevrimiçi deneyin!


Yerleşik kullanımı aslında daha uzun:

Python , 43 bayt

lambda:paretovariate(1)
from random import*

Çevrimiçi deneyin!

Her iki çözüm de Python 2 ve Python 3'te çalışır.


1
Tam programlar girdi kullanmayan görevler için daha kısadır, kullanma özelliği printbir bayttan tasarruf sağlar.
Outgolfer Erik

1

J , 5 bayt

%-.?0

Ot nasıl çalışır:

?0 0'dan büyük ve 1'den küçük rastgele bir değer oluşturur

-. 1'den çıkarma

% karşılıklı

Çevrimiçi deneyin!


Herkese not: issacg, bazı kesinsizliklere izin veren bazı kurallar ekledi, bu nedenle buradaki çoğu cevap gerekenden daha uzundur.
kullanici202729



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!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.