SORU
27 Ocak 2010, ÇARŞAMBA


Rastgele zar zor rasgele değildir?

Bu randint rastgelelik testi yaptım:

>>> from random import randint
>>>
>>> uniques = []
>>> for i in range(4500):  # You can see I was optimistic.
...     x = randint(500, 5000)
...     if x in uniques:
...         raise Exception('We duped %d at iteration number %d' % (x, i))
...     uniques.append(x)
...
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
Exception: We duped 887 at iteration number 7

Yaklaşık 10 kere daha denedim ve en iyi sonucu tekrarlayıcı önce 121 tekrarlamalar oldu. Bu standart kütüphaneden alabilirsiniz sonuç iyi mi?

CEVAP
27 Ocak 2010, ÇARŞAMBA


PRNGs sandığınızdan daha sık çiftleri üretmek neden Doğum günü Paradoksu ya.


OP sorunu oyunda bir kaç sorunu var. Bir ve ikinci doğası gereği belirli bir sayıda tekrar yaşanmaması garanti etmez üreten, ne doğa üstü birthday paradox olarak bahsedilen.

Doğum günü Paradoksu verilen değer bir kez daha jeneratör döneminde ortaya çıkabilir geçerlidir ve bu nedenle yinelenen değerleri bir örnek içinde olabilir. Doğum günü Paradoksu etkisi böyle çiftleri almanın gerçek ihtimali oldukça önemli olduğunu ve bir daha küçük. aralarında ortalama süresi aksi bir düşünce olabilir. Percived ve gerçek değerler arasındaki bu uyumsuzluk Doğum günü Paradoksu bir saf sezgisel bir tahmin çılgınca yanlış olmak üzere) cognitive bias, iyi örnek bir örneğini teşkil ediyor.

Sözde hızlı bir astar Rastgele Sayı üreteci PRNGs)

Senin sorunun ilk bölümünü rastgele sayı üreteci ve çok daha küçük bir sayıya dönüştürme maruz değer alıyor, olası değerler alanı azalır. pseudo-random number generators Bazı yaşadıkları dönemde değerleri tekrar etmeyin, ancak bu dönüşüm çok daha küçük bir etki alanı değişiklikleri. Daha küçük bir etki 'hayır tekrarlar tekrarlar. önemli bir olasılık bekleyebilirsiniz böylece' durumu geçersiz kılar

Bazı algoritmalar, linear congruential PRNG bu(A'=AX|M) gibiyapıntüm dönem için benzersizliğini garanti. Bir A olarak oluşturulan değer akümülatör tüm devlet içerir ve ek bir devlet tutulur. Jeneratör deterministik ve bu süre içinde bir dizi tekrar - herhangi bir akümülatör değeri, yalnızca bir olası ardışık değer ifade edebilir. Bu nedenle, her değeri sadece bir kez jeneratör bir süre içinde ortaya çıkabilir. Ancak, böyle bir PRNG dönemi nispeten küçük - A algoritma tipik uygulamaları için 2^30 - ve muhtemelen farklı değerler sayısından daha büyük olamaz.

Tüm PRNG payı bu karakteristik algoritmaları; bazı süre içerisinde belirli bir değeri tekrar eder. OP sorunu Mersenne Twister algoritma (Python random modülde kullanılan) çok uzun bir süre - 2^32'den çok daha büyük. Doğrusal Congruential bir PRNG aksine, sonuç tamamen akümülatör durumunu içeren ek olarak önceki çıkış değeri bir işlev değil. 32 bit tamsayı çıktı ve ~2^19937 bir süre ile bu mümkün değildir, böyle bir garanti sağlar.

Merseene Twister istatistik ve geometrik özelliklere ve çok uzun bir süre - bir PRNG simülasyon modeller için uygun özelliklere sahiptir, çünkü PRNGs için popüler bir algoritma.

  • İyi statistical properties Sayı algoritması tarafından oluşturulan eşit numara diğerlerine göre görünen önemli ölçüde daha yüksek bir olasılık olması ile dağıtılır anlamına gelir. Zavallı istatistiksel özellikleri sonuçlarında istenmeyen eğ üretmek olabilir.

  • İyi geometric properies N sayı kümesi N-boyutlu uzayda bir hiperdüzlem üzerinde yalan söylemez. Zavallı geometrik özellikleri simülasyon modeli sahte korelasyon oluşturmak ve sonuçlarını bozabilir.

  • Uzun bir süre sıra etrafında başlamak için sarar önce sayıları bir sürü oluşturmak anlamına gelir. Bir model tekrarlamalar çok sayıda ihtiyacı veya birkaç tohum çalıştırılacak varsa o zaman 2^30 ayrık sayıları A tipik bir uygulama mevcut yeterli olmayabilir. MT19337 algoritma çok uzun bir süre - 2^19337-1, ya da 10^5821. Karşılaştırma evrendeki atom sayısı 10 üzeri 80 yaklaşık olarak tahmin ediliyor.

32 bit tamsayı MT19337 PRNG tarafından üretilen muhtemelen yeterince ayrık gibi büyük bir döneminde tekrarlanmaması için değerleri temsil eder. Bu durumda yinelenen değerleri oluşabilir ve yeterince büyük bir örnek ile kaçınılmaz.

Özetle Doğum günü Paradoksu

Bu sorun aslında oda aynı doğum gününü paylaşan herhangi iki insanın olasılığı olarak tanımlanır. Kilit noktası buher ikiodadaki insanlar bir doğum günü paylaşmak. İnsanların eğilimi safça yanlış sorun olarak olasılık biri odada bir doğum günü ile belirli bir birey, hangi kaynak cognitive bias sık sık neden insanları hafife alma olasılığı. Bu yanlış varsayım - maç belirli bir birey için bir gereksinim yoktur ve herhangi iki kişi maç olabilir.

This graph shows the probability of a shared birthday as number of people in the room increases.  For 23 people the probability of two sharing a birthday is just over 50%.

Bir maç her iki birey arasında gerçekleşen olasılık maç belirli bir tarih için değil, belirli bir birey için bir eşleşme ihtimali çok daha yüksek. Bunun yerine, sadece aynı doğum gününü paylaşan iki kişi bulmak zorunda. Bu grafik (hangi bulunabilir wikipedia sayfasında konu), bunu görebiliyoruz biz sadece 23 Kişi oda için orada olmak için bir 50% şans bulma iki maç bu şekilde.

Wikipedia entry on the subject 4,500 Olası var OP sorunu nice summary. bir 'doğum günü', yerine 365 alabiliriz. Rasgele değerleri belli bir sayıda (denk 'insanlar') olasılığını bilmek istiyoruz . oluşturulan ^em>herhangi biriki özdeş değerler dizisi içinde görünen.

OP sorun, Doğum günü Paradoksu Olası etkisi bilgi işlem

100 sayı dizisi için, (yani ilk saniye ile maç olabilir, vb. üçüncü olarak, Maç olabilecek (100 * 99) / 2 = 4950 çift (Understanding the Problem) var ikinci, üçüncü, dördüncü vb maç olabilir. vb.) sayısıkombinasyonlarbu sadece daha fazla 100 ziyade maç olabilir.

Calculating the Probability 1 - (4500! / (4500**100 * (4500 - 100)!) bir ifadesi. Python aşağıdaki kod parçası aşağıda eşleşen bir çift oluşma olasılığı naif bir değerlendirme yapar.

# === birthday.py ===========================================
#
from math import log10, factorial

PV=4500          # Number of possible values
SS=100           # Sample size

# These intermediate results are exceedingly large numbers;
# Python automatically starts using bignums behind the scenes.
#
numerator = factorial (PV)          
denominator = (PV ** SS) * factorial (PV - SS)

# Now we need to get from bignums to floats without intermediate
# values too large to cast into a double.  Taking the logs and 
# subtracting them is equivalent to division.
#  
log_prob_no_pair = log10 (numerator) - log10 (denominator)

# We've just calculated the log of the probability that *NO*
# two matching pairs occur in the sample.  The probability
# of at least one collision is 1.0 - the probability that no 
# matching pairs exist.
#
print 1.0 - (10 ** log_prob_no_pair)

Bu arama sonucu bir mantıklı üretir0.669 p=bir maçta 100 sayı 4500 olası değerler nüfusu (Belki biri bunu doğrulamak ve eğer yanlış bir yorum sonrası olabilir) numune içinde meydana gelen için. Bu sayı eşleştirme OP tarafından gözlenen arasında çalışır uzunlukları oldukça makul gibi görünüyor görebilirsiniz.

Dipnot: sözde rasgele sayı benzersiz bir sıra ile karıştırma

Rasgele sayılar garantili benzersiz bir set almanın bir aracı için this answer below from S. Mark bkz. Poster için başvurduğu teknik, sayı dizisi onları benzersiz yapabilirsiniz kaynağı, () alır ve rasgele düzen içine karıştırır. Bu sıra numaraları çizim diziyi tekrar garanti değildir, bu sözde rasgele sayı dizisi verecek karıştırılır.

Dipnot: Şifreleme Açısından Güvenli PRNGs

MT algoritma nispeten kolay bir sayı dizisi gözlemleyerek jeneratör iç durumu anlaması için cryptographically secure değildir. Blum Blum Shub gibi diğer şifreleme algoritmaları uygulamaları için kullanılır, ama simülasyon veya genel rasgele sayı uygulamaları için uygun olabilir. Şifreleme açısından güvenli PRNGs pahalı (belki de bignum hesaplamalar gerektiren) olabilir ya da iyi geometrik özelliklere sahip olmayabilir. Algoritma bu tür bir durumda en öncelikli hedef açısından değerler dizisi gözlemleyerek jeneratör iç durumu anlaması için olanaksız olduğunu.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • adrianisen

    adrianisen

    25 Kasım 2009
  • hytchme

    hytchme

    9 Mart 2014
  • Kamikazeepanda

    Kamikazeepan

    5 ŞUBAT 2006