“Rasgeleliği” anlama


829

Kafamı bulamıyorum, hangisi daha rastgele?

rand()

VEYA :

rand() * rand()

Gerçek bir zeka oyunu buldum, bana yardım edebilir misin?


DÜZENLE:

Sezgisel olarak matematiksel cevabın eşit derecede rastgele olacağını biliyorum, ama yardımcı olamaz ama ikisini birlikte çarptığınızda "rastgele sayı algoritmasını iki kez çalıştırırsanız sadece yapmaktan daha rastgele bir şey yaratacağınızı düşünebilirsiniz. bir kez.


162
"Daha rastgele" ile ne demek istiyorsun?
dan04

55
Diğerlerinin de belirttiği gibi, bu iki miktar aynı dağılıma sahip değildir. Gerçekte aldığınız dağıtım için mathworld.wolfram.com/UniformProductDistribution.html adresine bakın . Bunu, aralıktaki tüm değerlerin eşit derecede muhtemel olduğu tek bir düzgün rasgele sayı ile karşılaştırın, böylece olasılık yoğunluk fonksiyonu yatay düz bir çizgidir.
bnaul

44
Şiddetle okumanızı öneririz Rastgele Stupidity üzerinde Günlük WTF . Özellikle bu yeni rastgele sayının çıktısını analiz ettikleri bu yorumu okuyun . Bundan uzaklaşacak mesaj şudur: rasgele sayılar üzerinde rasgele işlemler rasgele çıktı ile sonuçlanmaz .
detly

51
: Ayrıca Sezgisel matematiksel cevabı onlar eşit rastgele olduklarını olacağını biliyoruz P: - yalnız sezgi yoluyla matematik yapabilirsek, biz bu kanlı sembollerin tüm ihtiyaç olmaz
detly

92
İstatistikleri ve
Sezgiyi

Yanıtlar:


1481

Sadece bir açıklama

Her ne kadar bir yalancı rastgele değişkenin ya da çarpımının rastgele olduğunu tespit etmeye çalıştığınızda önceki cevaplar doğru olsa da, Random () genellikle eşit olarak dağıtılırken Random () * Random () ' in olmadığını bilmelisiniz .

Misal

Bu, sözde rasgele bir değişken aracılığıyla simüle edilen tek tip rasgele bir dağıtım örneğidir :

Rastgele Histogram ()

        BarChart[BinCounts[RandomReal[{0, 1}, 50000], 0.01]]

Bu iki rastgele değişkeni çarptıktan sonra elde ettiğiniz dağılımdır:

Rastgele Histogram () * Rastgele ()

        BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] * 
                                 RandomReal[{0, 1}, 50000], {50000}], 0.01]]

Yani her ikisi de “rasgele”, ancak dağılımları çok farklı.

Başka bir örnek

İken 2 * Rastgele () eşit dağıtılır:

Histogram 2 * Rastgele ()

        BarChart[BinCounts[2 * RandomReal[{0, 1}, 50000], 0.01]]

Rastgele () + Rastgele () değil!

Rastgele Histogram () + Rastgele ()

        BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] + 
                                 RandomReal[{0, 1}, 50000], {50000}], 0.01]]

Merkezi Limit Teoremi

Merkezi Limit Teoremi toplamı belirtiyor Random () bir eğilimi normal dağılıma terimleri artışına yol açmıştır.

Sadece dört terim ile:

Rastgele Histogram () + Rastgele () + Rastgele () + Rastgele ()

BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] + RandomReal[{0, 1}, 50000] +
                   Table[RandomReal[{0, 1}, 50000] + RandomReal[{0, 1}, 50000],
                   {50000}],
         0.01]]  

Ve burada 1, 2, 4, 6, 10 ve 20 eşit dağılmış rastgele değişkenler ekleyerek bir üniformadan normal dağılıma giden yolu görebilirsiniz:

Farklı rasgele değişken sayılarının histogramı eklendi

Düzenle

Birkaç kredi

Sayesinde Thomas Ahle son iki resimde gösterilen olasılık dağılımları olarak bilinir o yorumların içinde işaret için Irwin-Hall dağılımı

Harika yırtılmış [] işlevi için Heike'ye teşekkürler


41
+1. OP muhtemelen tekdüze dağıtım istediğinden, bu kabul edilen cevap olmalıdır. Ve eğer böyle yaparsanız rand()+rand(), bir yağ merkezi ile "2d6" tipi bir dağılım elde edersiniz.
Thilo

8
Bu çok ilginç, ama içimden ne kadar sezgisel olduğunu beni öldürüyor. Dağıtım hakkında biraz daha okuduktan sonra daha ayrıntılı bir şekilde bakacağım. Çok teşekkür ederim!
Trufa

46
@Trufa: Belki de sezginin bir kısmında, en azından meblağlar için yardımcı olacaktır. Bir haddelenmiş kalıbın "ortalamasını" aldığınızı düşünün. Şimdi ortalama iki zar aldığınızı hayal edin. Şimdi yüz. Daha fazla zar ekledikçe ortalama bir ya da altı elde etme şansına ne olur?
johncip

3
@matt b Grafikler Mathematica'daki tek satırlıktır. Kod, her grafikten önce gelen kalın yazı tipidir. Mathematica Parsel yapmak için harika bir dildir!
Dr. belisarius

4
@thenonhacker: evet, histogramlar yanlılık gösterir, ancak rastgele olmayanlık göstermezler. Eğimli rasgele sayılar daha az rasgele değildir. Kullanıcının orijinal sorusunun doğru cevabına gelince, "akıllı olmaya çalışmayın, işleri daha da kötüleştireceksiniz" ve bu cevap bu noktayı aşmaktadır.
Kennet Belenky

151

Her iki yöntem de rastgele olsa da bağırsağım rand() * rand()daha az rastgele olduğunu söylese de daha fazla sıfır ekiyordu . En kısa sürede bir şekilde rand()olduğu 0, toplam hale0


18
Bu şeridi kullanan tüm cevaplara cevabım şudur: Mizahı seviyorum, ama CW olmalı !
Andreas Rejbrand

4
@Andomar: Hayır, değil. Bir şey değil. CW'nin ne olduğunu biliyor musunuz?
Andreas Rejbrand

17
@Andreas Rejbrand: CW, cevaplayanların itibarını reddederek ilginç soruları öldüren bir silahtır. Görünüşe göre nerfed meta.stackexchange.com/questions/392/… (belki de bu ilginç soru ortaya çıkıyor!)
Andomar

11
@Andomar - Evet, CW ilginç sorular öldürür ama (dan SSS ) "İtibar ne kadar topluluk ortaklıklarının Eğer kaba bir ölçümüdür." Cevabınıza komik, telif hakkıyla korunan bir resim eklerseniz , cevabınızın havalı olduğunu düşündürür ve muhtemelen sizin de havalı olduğunuzu düşünürüm , ancak sizi daha fazla güveye layık yapmaz - bu nedenle, ideal olarak, rep yok verilmelidir. Bunun CW anlamına gelip gelmediği veya kişinin cevap veremeyeceği anlamına gelip gelmediği başka bir konudur.
Richard JP Le Guen

13
karikatürdeki "rastgele jeneratör" trolü sadece bir savurgan iting olabilir ve sadece Feynman noktasına ulaşır . btw, π basamaklar rastgele mi? :)
mykhal

82

İkisi de 'daha rastgele' değildir.

rand()psuedo-random bir tohuma (genellikle her zaman değişen mevcut saate bağlı olarak) dayalı tahmin edilebilir bir sayı kümesi üretir. Sekansta art arda iki sayının çarpılması, farklı fakat aynı derecede öngörülebilir bir rakam dizisi oluşturur.

Bunun çarpışmaları azaltıp azaltamayacağını ele alan cevap hayır. Aslında iki sayıyı çarpma etkisinden dolayı çarpışmaları artıracaktır 0 < n < 1. Sonuç daha küçük bir fraksiyon olacak ve sonuçta spektrumun alt ucuna doğru bir sapmaya neden olacaktır.

Bazı açıklamalar. Aşağıda, 'öngörülemeyen' ve 'rastgele' birisinin bir sonraki sayının önceki sayılara dayanarak ne olacağını tahmin etme yeteneğini, yani. bir kehanet.

xAşağıdaki değerler listesini oluşturan tohum verilir :

0.3, 0.6, 0.2, 0.4, 0.8, 0.1, 0.7, 0.3, ...

rand()yukarıdaki listeyi rand() * rand()oluşturur ve oluşturur:

0.18, 0.08, 0.08, 0.21, ...

Her iki yöntem de aynı tohum için her zaman aynı sayı listesini üretecektir ve bu nedenle bir kehanet tarafından eşit olarak öngörülebilir. Ancak, iki çağrıyı çarpma sonuçlarına bakarsanız 0.3, orijinal sıradaki iyi bir dağılıma rağmen hepsinin altında olduğunu görürsünüz . İki kesirin çarpılmasının etkisi nedeniyle sayılar önyargılıdır. Ortaya çıkan sayı her zaman daha küçüktür, bu nedenle hala tahmin edilemez olmasına rağmen bir çarpışma olma olasılığı daha yüksektir.


9
+1 Öte yandan rand()+rand()+rand()...giderek "daha az rasgele" oluyor (rasgele olarak tekdüze olarak dağıtıyorsanız).
Thilo

4
@Thilo Hayır, değil mi ...? Rasgele bir değişken (0,1) aralığında eşit olarak dağıtılırsa ve değişkeni n kez örneklerseniz ve toplamı alırsanız, bu değişken (0, n) aralığında eşit olarak dağıtılır.
user359996

5
@Trufa sadece rand()rastgele olmaya güveniyor ve rastgele olduğunu 'geliştirmeye' çalışmayın. Tohumu birkaç kez ayarlamayın. Herhangi bir tohum, yarı rastgele olduğu sürece mükemmeldir. Gördüğüm pek çok uygulama UNIX çağını tohum olarak kullanıyor, bu da her saniye değişiyor ve her değiştiğinde benzersiz.
Matthew Scharley

61
@ user359996 rand () + rand () eşit olarak dağıtılmamıştır. İki zar ekleyin, 2'den 7
kazanma

4
@thenonhacker Yazıdaki rastgele tanımımı görün. Değerler spektrumun bir ucuna yöneldiğinden, rastgele kelimeyi kullandığımda bahsettiğim şey, üretilen kesin değerlerin öngörülebilirliğini arttırmaz. Daha sonra önyargı konusunu ayrı ayrı ele almaya devam ettim.
Matthew Scharley

80

Bir noktayı göstermek için aşırı basitleştirme.

Rastgele işlevinizin yalnızca 0veya çıktılarını varsayalım 1.

random()biri (0,1), ama random()*random()biri(0,0,0,1)

0İkinci durumda a alma şansının hiçbir şekilde a alma şansına eşit olmadığını açıkça görebilirsiniz 1.


Öncelikle bu cevabı yayınlanmıştır zaman okumayı bir kişinin bir bakışta arasındaki farkı anlamak olasıdır So olduğunca kısa tutmak istedim random()ve random()*random()ama orijinal reklam litteram soruya cevap kendimi tutamam:

Hangisi daha rastgele?

Bu olmak random(), random()*random(), random()+random(), (random()+1)/2ya da sabit bir sonuca yol herhangi başka bir kombinasyon (yalancı rasgele jeneratörler durumunda veya aynı başlangıç durumunu) entropi aynı kaynağına sahip, cevap olduklarını olacaktır eşit (fark rastgele dağıtımlarında). Bakabileceğimiz mükemmel bir örnek Craps oyunudur. Aldığınız sayı olurdu random(1,6)+random(1,6)ve hepimiz biliyoruz ki 7 elde etmek en yüksek şansa sahip, ancak bu iki zar atmanın sonucunun, atmaktan çok veya daha az rastgele olduğu anlamına gelmez.


Şeytanca zor bir şeyi "farklı dağılımlar üzerinde eşit derecede rasgele" haline getirmek için +1. Çok zarif.
Jens Roland

3
Bu nedenle teknik olarak, (random () * 0 + 9) eşit olarak rastgele, çünkü 1 elemanlı kümeden rastgele bir değer döndürüyor: [9]. Dilbert karikatürü haklıydı.
Jens Roland

2
@Jens Rolan "sabit bir sonuca yol açmayan diğer tüm kombinasyonlar";). 999999 <i> muhtemelen </i> rastgele üretilmez ve rastgele üretilme şansı hesaplanabilir.
Alin Purcaru

69

İşte basit bir cevap. Tekel'i düşünün. İki altı yüzlü zar (veya oyun gösterimini tercih edenler için 2d6) yuvarlar ve toplamlarını alırsınız. En yaygın sonuç 7'dir çünkü 7'yi yuvarlamanın 6 olası yolu vardır (1,6 2,5 3,4 4,3 5,2 ve 6,1). Oysa 2 sadece 1,1 üzerine yuvarlanabilir. Aralık aynı olsa bile 2d6 yuvarlanmasının 1d12 yuvarlanmasından farklı olduğunu görmek kolaydır (1d12'de 1 elde edebileceğinizi göz ardı ederek nokta aynı kalır). Sonuçlarınızı eklemek yerine çoğaltmak onları benzer bir şekilde çarptıracak ve sonuçlarınızın çoğu aralığın ortasında olacak. Aykırı değerleri azaltmaya çalışıyorsanız, bu iyi bir yöntemdir, ancak eşit bir dağıtım yapmaya yardımcı olmaz.

(Ve garip bir şekilde, düşük ruloları da artıracaktır. Rastgeleğinizin 0'da başladığını varsayarsak, 0'da bir artış göreceksiniz, çünkü diğer rulo her ne olursa olsun 0'a dönüşecektir. 0 ile 1 (dahil) arasında iki rastgele sayı düşünün Her iki sonuç da 0 olursa, diğer sonuç ne olursa olsun her şey 0 olur. 1'den bir tane almanın tek yolu her iki topun da 1 olmasıdır. Pratikte bu muhtemelen önemli olmaz ancak garip bir grafik oluşturur.)


4
"Sonuçlarınızı eklemek yerine çoğaltmak onları benzer bir şekilde çarptıracak ve sonuçlarınızın çoğu aralığın ortasında olacak." - belisarius'un cevabındaki ikinci grafiğe karşı bu iddiayı kontrol edin.
Daniel Earwicker

52

Zorunlu xkcd ...
dönüş 4;  // rastgele olduğu garanti edilen adil zar rulosu tarafından seçilir.


7
danmn bu her zaman "rastgele görünür" kelimesi ortaya çıkıyor ortaya çıkıyor :) Ben bekliyordum !!
Trufa

9
Mizahı severim, ama CW olmalı .
Andreas Rejbrand

2
@Andreas Rejbrand - bu "mizah" cevabı neden CW olmalı?
warren

16
Eğer CW değilse, her oylamada üne cevap poster gönderilir (şimdiye kadar 160 temsil). Şimdi, itibar okuldaki notlar gibidir - teknik (bu durumda, programlama) uzmanlığı sertifikası olmalıdır. Bu nedenle, kolayca kaldırılabilen ancak böyle bir uzmanlığa ihtiyaç duymayan bir şey göndererek itibar kazanılmamalıdır. Ayrıca, itibar puanı kullanıcının ayrıcalıklarını da belirler. Örneğin, 10.000 puanla kullanıcı StackOverflow'daki denetleme araçlarına erişir.
Andreas Rejbrand

35

Bunu daha farklı rakamlarla düşünmek yardımcı olabilir. 1 ile 36 arasında rastgele sayılar üretmek istediğinizi düşünün, böylece en kolay yolun iki adet adil, 6 taraflı zar atmaya karar verdiniz. Bunu aldın:

     1    2    3    4    5    6
  -----------------------------
1|   1    2    3    4    5    6
2|   2    4    6    8   10   12
3|   3    6    9   12   15   18
4|   4    8   12   16   20   24   
5|   5   10   15   20   25   30
6|   6   12   18   24   30   36

Yani 36 sayımız var, ancak hepsi adil bir şekilde temsil edilmiyor ve bazıları hiç oluşmuyor. Merkez diyagonalin yakınındaki sayılar (sol alt köşeden sağ üst köşeye) en yüksek sıklıkta ortaya çıkar.

Zarlar arasındaki haksız dağılımı tanımlayan aynı ilkeler 0.0 ile 1.0 arasındaki kayan nokta sayıları için de geçerlidir.


3
Daha somut bir şekilde göstermek için +1, rastgele sayıları çarparken dağıtımdaki değişiklik. Matris, kelimelerden ve hatta bir dağıtım grafiğinden daha fazlasına yardımcı oldu.
Marjan Venema

26

"Rasgelelik" ile ilgili bazı şeyler sezgiseldir.

Düz dağıtım varsayılırsa rand(), aşağıdakiler size düz olmayan dağıtımlar sağlar:

  • yüksek sapma: sqrt(rand(range^2))
  • ortadaki zirve: (rand(range) + rand(range))/2
  • Düşük: önyargı: range - sqrt(rand(range^2))

Belirli yanlılık eğrileri oluşturmanın başka birçok yolu vardır. Hızlı bir test yaptım rand() * rand()ve bu size çok doğrusal olmayan bir dağılım kazandırıyor.


24

Çoğu rand () uygulamasının bir süresi vardır. Yani, çok sayıda çağrıdan sonra sıra tekrarlanır. rand() * rand()Yarıda tekrarlanan çıktıların sırası , dolayısıyla bu anlamda "daha az rastgele" dir.

Ayrıca, dikkatli bir yapı olmadan, rastgele değerler üzerinde aritmetik yapmak daha az rastgele çalışmaya neden olma eğilimindedir. Yukarıdaki bir poster aslında " rand()+ rand()+ rand()..." (k çarpı diyelim), aslında değer aralığının ortalama değerinin k çarpı dönme eğilimi gösterir rand(). (Bu konuda simetrik adımlar içeren rastgele bir yürüyüş.)

Somutluk için, rand () işlevinizin [0,1) aralığında eşit olarak dağıtılmış rasgele gerçek bir sayı döndürdüğünü varsayın. (Evet, bu örnek sonsuz hassasiyete izin verir. Bu, sonucu değiştirmez.) Belirli bir dili seçmediniz ve farklı diller farklı şeyler yapabilir, ancak aşağıdaki analiz rand'ın sapkın olmayan uygulamaları için değişiklikler içerir ( ). Ürün rand() * rand()ayrıca [0,1) aralığındadır, ancak artık eşit olarak dağılmamıştır. Aslında, ürünün [1 / 4,1) aralığında olduğu gibi [0,1 / 4) aralığında olması muhtemeldir. Daha fazla çarpma sonucu sıfıra doğru daha da çarpacaktır. Bu, sonucu daha öngörülebilir kılar. Geniş vuruşlarda, daha tahmin edilebilir == daha az rastgele.

Tekdüze rasgele girdi üzerindeki hemen hemen tüm işlem dizileri tekdüze rastgele olacaktır ve bu da öngörülebilirliğin artmasına neden olacaktır. Dikkatle, bu özelliğin üstesinden gelinebilir, ancak daha sonra aritmetik ile zaman harcamak yerine, gerçekten istediğiniz aralıkta düzgün dağıtılmış rastgele bir sayı oluşturmak daha kolay olurdu.


Ben de rastgele jeneratör döneminden iki kat daha hızlı geçeceğini düşündüm.
Jared Updike

3
Dizi uzunluğu sadece eşitse yarıya kesilir. Tuhafsa, r1 * r2, r3 * r4, ..., rn * r1, r2 * r3, r4 * r5 alırsınız ve toplam uzunluk aynıdır.
Jander

23

"rastgele" ve "daha rastgele" biraz daha sıfırın hangisinin daha sıfır olduğunu sormaya benzer.

Bu durumda, randbir PRNG, bu yüzden tamamen rastgele değil. (aslında, tohum biliniyorsa oldukça tahmin edilebilir). Başka bir değerle çarpmak, onu az ya da çok rastgele yapmaz.

Gerçek bir kripto tipi RNG aslında rastgele olacaktır. Ve herhangi bir işlev aracılığıyla değerlerin çalıştırılması ona daha fazla entropi ekleyemez ve entropiyi büyük olasılıkla kaldırabilir, böylece artık rasgele olmaz.


3
Not: Bu her çağrı farklı bir değer döndürdüğünden, bu kare değildir. Yine de her şey doğrudur.
Matthew Scharley

2
@thenonhacker: Kendi açıklamanızla, "1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10 , 1,2,3,4,5,6,7,8,9,10 ... "rastgele. Tüm sayılar adil bir şansla eşit olarak dağıtılır. Zirve veya sapma yoktur. Gerçekten bu sırayı rasgele düşünüyor musunuz ??? Tanımınızı değiştirmeniz gerekiyor. Rastgele çıktıyla ilgili değildir, rastgele çıktıyı oluşturmak için kullanılan işlemle ilgilidir .
abelenky

2
@CurtainDog: Metin sıkıştırma, aynı miktarda entropiyi ifade etmek için gereken bit sayısını azaltırken entropi seviyesini aynı tutar.
Kennet Belenky

4
@thenonhacker, @abelenky: Dağıtımlar bile kolaydır. Rasgele sayı üretecinde önemli olan, rasgele sayı üretecinin durumundaki bit sayısıdır. Bir sıfır-durum rasgele sayı üreteci (örneğin 4, 4, 4, 4, 4, ...) tamamen öngörülebilir. Tek seferlik ped, ürettiği değerlerin sayısı kadar bir duruma sahiptir, bu nedenle öngörmeyi imkansız hale getirir. İki PNRG'nin konvolüsyonu, her ikisi de içerdikleri kadar entropi biti olan bir PNRG üretecek, kovaryansları eksi.
Kennet Belenky

1
@Kennet - Teşekkürler, bunu benim için çok temizledin. @abelenky - iyi, seni şimdi elde ediyorum.
CurtainDog

20

Aradığınız kavram "entropi", bir dizi bitin bozukluğunun "derecesi" dir. Bu fikir, "maksimum entropi" kavramı açısından anlaşılması en kolay olanıdır.

Maksimum entropi ile bir bit dizisinin yaklaşık bir tanımı, tam olarak daha kısa bir bit dizisi olarak ifade edilememesidir (yani, daha küçük dizgiyi orijinal dizgeye geri genişletmek için bazı algoritma kullanarak).

Maksimum entropinin rastgelelikle ilgisi, bir sayıyı "rastgele" seçerseniz, bit dizesi maksimum entropiye yakın olan bir sayıyı kesinlikle seçeceğinizden, yani sıkıştırılamamasından kaynaklanır. Bu, "rastgele" bir sayıyı neyin karakterize ettiğini en iyi anlamaktır.

Eğer rastgele olarak "iki kez" iki rastgele numune rastgele bir sayı çıkarmak istiyorsanız Yani, diye bitiştirmek birlikte iki bitlik dizeleri. Pratik olarak, örnekleri çift uzunluktaki bir kelimenin yüksek ve düşük yarılarına doldurursunuz.

Daha pratik bir notta, kendinizi berbat bir rand () ile sararsanız, bazen birkaç örneği bir araya getirmeye yardımcı olabilir - ancak, eğer gerçekten kırılmışsa bile bu prosedür yardımcı olmaz.


2
Xor ile rastgele sayı nesillerini hiç düşünmemiştim, ama sanırım konsepti oldukça uzağa götürebilirsiniz ( en.wikipedia.org/wiki/Mersenne_twister )! Cevap için teşekkürler.
Gabriel Mitchell

1
Bu cevabı atmak için gerçekten mücadele ediyorum ... stackoverflow.com/questions/3956478/understanding-randomness/… ve stackoverflow.com/questions/3956478/understanding-randomness/… adresinde verilen cevaplarla maksimum entropi yenilmiyor mu? . Bu gibi durumlarda, seçilen numara sıkıştırılamaz, ancak rasgele olarak adlandırmak zor olabilir.
CurtainDog

1
+1 Kabul edilen cevap kadar güzel, bu benim favorim. Bilgisayarlar söz konusu olduğunda, her zaman bitler halinde düşünün - gerçekler açısından düşünmeye çalışmaktan çok daha az kafa karıştırıcı ve daha alakalı. (Cevabımı yazdım ve sonra bunu fark ettim, bu yüzden benimki bunun bir genişlemesinden başka bir şey değil - belki biraz entropi eklenmiş).
Daniel Earwicker

1
@CurtainDog xkcd'nin rasgele sayısı 4veya ikili 0100değeri sıfır bit olarak sıkıştırılabilir. Dekompresyon programı basitçe '4'e dönecektir. Bundan daha az rastgele olmaz. Dilbert ile ilgili sorun şu ki, onu sıfır bitlere sıkıştırabilir miyiz bilmiyoruz (her zaman 'dokuz' döndürerek açma). Sekiz de geri dönebilir, o zaman 1 bite sıkıştırabiliriz. Sıkıştırma: 0-> dokuz, 1-> sekiz. 1 rastgele bitimiz olurdu.
Ishtar

14

Kabul edilen cevap çok güzel, ama sorunuzu cevaplamanın başka bir yolu var. PachydermPuncher'ın cevabı zaten bu alternatif yaklaşımı benimsiyor ve ben biraz daha genişleteceğim.

Bilgi teorisi hakkında düşünmenin en kolay yolu, en küçük bilgi birimi, tek bir bittir.

C standart kitaplığında, rand()0 - aralığında bir tam sayı RAND_MAX, platforma bağlı olarak farklı tanımlanabilecek bir sınır döndürür . Farzedin ki bazı tamsayı nerede RAND_MAXolarak tanımlanır (bu, Microsoft'un 15 olduğu uygulamada olur ). O zaman iyi bir uygulamanın bilgi parçalarını getireceğini söyleyebiliriz .2^n - 1nnn

rand()Bir bitin değerini bulmak için bir bozuk para çevirerek ve sonra 15 bitlik bir toplu alana kadar tekrarlayarak rastgele sayılar oluşturduğunu düşünün . Daha sonra bitler bağımsızdır (herhangi bir bitin değeri, aynı partideki diğer bitlerin belirli bir değere sahip olma olasılığını etkilemez). Dolayısıyla, bağımsız olarak kabul edilen her bit, 0 ile 1 dahil rastgele bir sayı gibidir ve bu aralıkta "eşit olarak dağıtılır" (1 olması muhtemeldir).

Bitlerin bağımsızlığı, bit partileri tarafından temsil edilen sayıların aralıklarında eşit olarak dağıtılmasını sağlar. Bu sezgisel olarak açıktır: 15 bit varsa, izin verilen aralık sıfır 2^15 - 1= 32767'dir. Bu aralıktaki her sayı, aşağıdaki gibi benzersiz bir bit modelidir:

010110101110010

ve bitler bağımsızsa, diğer paternlerden daha fazla patern meydana gelme olasılığı daha düşüktür. Bu nedenle, aralıktaki tüm olası sayılar eşit derecede olasıdır. Ve böylece tersi doğrudur: rand()eşit dağıtılmış tamsayılar üretirse, bu sayılar bağımsız bitlerden yapılır.

Bu yüzden rand(), bitleri yapmak için, sadece keyfi boyutta gruplar halinde hizmet veren bir üretim hattı olarak düşünün . Boyutu sevmiyorsanız, partileri ayrı parçalara ayırın ve sonra istediğiniz miktarlarda bir araya getirin (ancak 2 gücü olmayan belirli bir aralığa ihtiyacınız varsa, sayılarınızı küçültmeniz gerekir) ve bunu yapmanın en kolay yolu kayan noktaya dönüştürmektir).

Orijinal önerinize geri dönersek, 15'lik gruplardan 30'lu gruplara gitmek rand(), ilk sayıyı sormak , 15 yer bit bitirmek ve sonra başka bir tane eklemek istediğinizi varsayalım rand(). Bu, rand()eşit bir dağılımı bozmadan iki çağrıyı birleştirmenin bir yoludur . Basitçe çalışır çünkü bilgi bitlerini yerleştirdiğiniz konumlar arasında çakışma yoktur.

Bu, rand()bir sabitle çarparak menzili "germek" ten çok farklıdır . Örneğin, aralığınızı ikiye katlamak rand()isterseniz, ikiyle çarpabilirsiniz - ancak şimdi sadece çift sayılar elde edersiniz ve asla tek sayılar olmaz! Bu tam olarak düzgün bir dağıtım değildir ve uygulamaya bağlı olarak ciddi bir sorun olabilir, örneğin tek / çift bahislere izin verdiği düşünülen rulet benzeri bir oyun. (Bitler açısından düşünerek, sezgisel olarak bu hatayı önlersiniz, çünkü ikiyle çarpmanın bitleri bir yere sola kaydırmak (daha fazla önem) ve boşluğu sıfırla doldurmakla aynı olduğunu fark edersiniz. Açıkçası bilgi miktarı aynı - biraz taşındı.)

Sayı aralıklarındaki bu tür boşluklar kayan nokta sayısı uygulamalarında kavranamaz, çünkü kayan nokta aralıklarında doğal olarak hiç temsil edilemeyen boşluklar vardır: Temsil edilebilir her iki yüzen arasındaki boşlukta sonsuz sayıda eksik gerçek sayı vardır puan numaraları! Bu yüzden, sadece boşluklarla yaşamayı öğrenmek zorundayız.

Diğerlerinin uyardığı gibi, sezgi bu alanda risklidir, özellikle de matematikçiler gerçek sayıların cazibesine karşı koyamadıkları için, bu korkunç sersemlikler ve görünür paradokslarla dolu şeyleri korkunç bir şekilde karıştırırlar.

Ama en azından bunun bit açısından olduğunu düşünüyorsanız, sezginiz sizi biraz daha ileriye götürebilir. Bitler gerçekten kolaydır - bilgisayarlar bile bunları anlayabilir.


3
+1: Aslında, iki IEEE çift kesinlikli kayan nokta arasında, (matematiksel) tamsayıların tamamında sayıdan daha fazla sayı eksik.
Donal Fellows

13

Diğerlerinin söylediği gibi, kolay kısa cevap: Hayır, daha rastgele değil, ama dağılımı değiştiriyor.

Bir zar oyunu oynadığınızı varsayalım. Tamamen adil, rastgele bir zarınız var. Her rulodan önce, ilk önce bir kaseye iki zar koyarsanız, onu sallarsanız, zarlardan birini rastgele seçtiyseniz ve daha sonra onu yuvarlarsanız, kalıp ruloları "daha rastgele" olur mu? Açıkçası fark etmezdi. Her iki zar rastgele sayılar verirse, iki zardan birini rastgele seçmek hiçbir fark yaratmaz. Her iki durumda da, yeterli sayıda rulo üzerinde eşit dağılımlı 1 ile 6 arasında rastgele bir sayı alırsınız.

Gerçek hayatta zarların adil OLMADIĞINDAN şüpheleniyorsanız böyle bir prosedürün yararlı olabileceğini düşünüyorum. Diyelim ki, zar biraz dengesiz ise, biri zamanın 1 / 6'sından daha sık 1 verme eğilimindedir ve diğeri alışılmadık şekilde 6 verme eğilimi gösterirse, o zaman ikisi arasında rastgele seçim yapmak önyargıyı gizleme eğilimindedir. (Bu durumda, 1 ve 6 yine de 2, 3, 4 ve 5'ten daha fazla gelecektir. Eh, sanırım dengesizliğin doğasına bağlı olarak.)

Rasgeleliğin birçok tanımı vardır. Rastgele bir serinin tanımı, rastgele bir işlemle üretilen bir sayı dizisidir. Bu tanıma göre, adil bir ölümü 5 kez yuvarlar ve 2, 4, 3, 2, 5 sayılarını alırsam, bu rastgele bir seridir. Daha sonra aynı adil ölümü 5 kez daha yuvarlar ve 1, 1, 1, 1, 1 alırsam, o zaman bu rastgele bir seridir.

Birkaç poster, bir bilgisayardaki rasgele işlevlerin gerçekten rasgele değil, yalancı rasgele olduğunu ve algoritmayı ve tohumu biliyorsanız, tamamen öngörülebilir olduklarına dikkat çekti. Bu doğrudur, ancak çoğu zaman tamamen alakasızdır. Bir deste desteyi karıştırıp birer birer çevirirsem, bu rastgele bir seri olmalı. Birisi kartlara göz atarsa, sonuç tamamen öngörülebilir olacaktır, ancak çoğu rasgelelik tanımı ile bu daha az rastgele olmayacaktır. Eğer seri istatistiksel rastgele testlerden geçerse, kartlara göz attığım gerçeği bu gerçeği değiştirmeyecek. Uygulamada, bir sonraki kartı tahmin etme yeteneğiniz üzerine büyük miktarlarda para kumar oynarsak, kartlara baktığınız gerçeği son derece alakalı. Diziyi, sistemin performansını test etmek için web sitemize gelen ziyaretçilerin menü seçimlerini simüle etmek için kullanırsak, göz atmış olmanız hiç fark etmez. (Bu bilgiden yararlanmak için programı değiştirmediğiniz sürece.)

DÜZENLE

Monty Hall sorununa benim cevabımı bir yorumda yapabileceğimi sanmıyorum, bu yüzden cevabımı güncelleyeceğim.

Belisarius bağlantısını okumayanlar için, özü şudur: Bir oyun şovu yarışmacısına 3 kapı seçeneği sunulur. Birinin arkasında değerli bir ödül, diğerlerinin arkasında değersiz bir şey var. 1 numaralı kapıyı seçer. Kazanan mı yoksa kaybeden mi olduğunu açıklamadan önce ev sahibi, kaybeden olduğunu göstermek için # 3 numaralı kapıyı açar. Daha sonra yarışmacıya 2 numaralı kapıya geçme fırsatı verir. Yarışmacı bunu yapmalı mı yapmamalı mı?

Birçok insanın sezgilerini rahatsız eden cevap, onun değişmesi gerektiğidir. İlk seçiminin kazanma olasılığı 1/3, diğer kapının kazanma olasılığı 2/3. İlk sezgim, diğer birçok insanla birlikte, geçişte kazanç olmayacağı, olasılıkların 50:50 olarak değiştirildiği.

Sonuçta, ev sahibi kaybeden kapıyı açtıktan hemen sonra birinin TV'yi açtığını varsayalım. O kişi kalan iki kapalı kapı görürdü. Oyunun doğasını bildiğini varsayarsak, her kapının ödülü gizleme şansının 1/2 olduğunu söylerdi. İzleyici için oranlar 1/2: 1/2 iken, yarışmacı için oranlar 1/3: 2/3 olabilir?

Gerçekten sezgilerimi şekillendirmek için bunu düşünmek zorunda kaldım. Bununla başa çıkmak için, böyle bir problemde olasılıklar hakkında konuştuğumuzda, mevcut bilgileri verdiğinizde atama olasılığınızı kastettiğimizi anlayın. Mesela kapıyı 1 numaraya koyan mürettebatın bir üyesi için, ödülün # 1 kapısının arkasında olma olasılığı% 100'dür ve diğer iki kapının herhangi birinin arkasında olma olasılığı sıfırdır.

Mürettebat üyesinin oranları yarışmacıların oranlarından farklıdır çünkü yarışmacının ödülü hangi kapıyı geride bıraktığını bilmediği bir şey biliyor. Benzer şekilde, yarışmacının oranları izleyicinin oranlarından farklıdır çünkü izleyicinin başlangıçta hangi kapıyı seçtiğini bilmediği bir şey biliyor. Bu ilgisiz değildir, çünkü ev sahibinin hangi kapıyı açacağı seçimi rastgele değildir. Yarışmacının aldığı kapıyı açmayacak ve ödülü gizleyen kapıyı açmayacak. Bunlar aynı kapı ise, bu ona iki seçenek bırakıyor. Eğer farklı kapılarsa, bu sadece bir tane bırakır.

Peki 1/3 ve 2/3 ile nasıl karşılaşacağız? Yarışmacı başlangıçta bir kapı seçtiğinde kazananı seçmek için 1/3 şansı vardı. Bence bu çok açık. Bu, diğer kapılardan birinin kazanma şansının 2/3 olduğu anlamına gelir. Ev sahibi oyun ona herhangi bir ek bilgi vermeden geçiş yapma şansı olsaydı, kazanç olmazdı. Yine, bu açık olmalıdır. Ancak ona bakmanın bir yolu, geçiş yaparak kazanma şansının 2/3 olduğunu söylemek. Ancak 2 alternatifi var. Yani her birinin sadece 2/3 bölümünün 2 = 1/3 kazanan olma şansı var, ki bu onun ilk seçiminden daha iyi değil. Tabii ki nihai sonucu zaten biliyorduk, bu sadece farklı bir şekilde hesaplıyor.

Ancak şimdi ev sahibi bu iki seçenekten birinin kazanan olmadığını ortaya koyuyor. Seçmediği bir kapının kazanma şansının 2 / 3'ünden dolayı, şimdi 2 alternatifin 1'inin olmadığını biliyor. Diğeri olabilir de olmayabilir de. Bu yüzden artık 2/3'e 2 bölündü. Açık kapı için sıfır ve kapalı kapı için 2/3 var.


Çok iyi benzetmeler! Bu çok iyi bir sade ingilizce açıklama sanırım ve diğer birçok farklı olarak, aslında soruma cevap verdiniz :)
Trufa

@Trufa @Jay Olaylar ve rastgelelik hakkında olası ön bilgi arasındaki karışıklık ÇOK yaygındır. Bir problemi çözen ve akademideki daha iyi matematikçilerin bazılarına utanç veren bir kadın hakkındaki bu ilginç hikayeyi sizinle paylaşmama izin verin. Daha sonra pişman olacak çok şey söylediler (örneğin, "Bir hata yaptın, ama olumlu tarafa bak. Bütün bu doktoralar yanlış olsaydı, ülke çok ciddi bir belada olurdu."). İşte düşüncelerinizle ilgili hikaye ... tadını çıkarın! marilynvossavant.com/articles/gameshow.html
Dr. belisarius

@belisarius yep. Blackjack21 diyorum :) şaka yapıyorum sana anladım!
Trufa

@belisarius BTW bunu hiç elde edemedim, şimdi başka bir deneyeceğim!
Trufa

@Trufa Ve burada Marilyn'in ifadesi akademik tepkiyi gösteren bir makale olduğunu query.nytimes.com/gst/... (ÇOK ÇOK eğlenceli)
Dr. Belisarius

11

Hatta kafa ve garip kuyruk olarak kabul edilir basit bir sikke çevirme sorunu var düşünün. Mantıksal uygulama:

rand() mod 2

Yeterince büyük bir dağılımda, çift sayıların sayısı tek sayıların sayısına eşit olmalıdır.

Şimdi hafif bir değişiklik yapalım:

rand() * rand() mod 2

Sonuçlardan biri eşitse, tüm sonuç eşit olmalıdır. 4 olası sonucu düşünün (çift * çift = çift, çift * tek = çift, tek * çift = çift, tek * tek = tek =). Şimdi, yeterince geniş bir dağılımda, cevap zamanın% 75'i bile olmalıdır.

Ben olsaydım kafaları bahis ederdim.

Bu yorum, neden rastgele bir matematiksel özellik üzerinde rastgele bir matematiksel özellik tartışması yerine, yönteminize dayalı özel rasgele bir işlev uygulamak gerekir neden bir açıklamadır.


1
Dikkat! rand()%2çok rasgele olmayabilir; bu gerçekten düşük bitin rastgele olmasına bağlıdır ve bazı PRNG'ler bu şekilde çok iyi değildir. (Tabii ki, bazı dillerde bir kayan nokta sonucu elde edersiniz, rand()böylece bunu bu şekilde yapamazsınız…)
Donal Fellows

10

Rastgele sayılarınızın kombinasyonlarına ne olacağından şüphe duyduğunuzda, istatistiksel teoride öğrendiğiniz dersleri kullanabilirsiniz.

OP'nin durumunda X * X = X ^ 2'nin sonucunun ne olduğunu bilmek ister; burada X, Uniform boyunca dağıtılan rastgele bir değişkendir [0,1]. CDF tekniğini kullanacağız çünkü bu sadece birebir eşleme.

X ~ Uniform [0,1] olduğundan cdf: f X (x) = 1 Y <- X ^ 2 dönüşümünü istiyoruz, böylece y = x ^ 2 Tersi bul x (y): sqrt (y) = x bu bize x'i y'nin bir fonksiyonu olarak verir. Ardından, dx / dy türevini bulun: d / dy (sqrt (y)) = 1 / (2 sqrt (y))

Y dağılımı şu şekildedir: f Y (y) = f X (x (y)) | dx / dy | = 1 / (2 metrekare (y))

Henüz bitirmedik, 0 <= x <1, 0 <= x ^ 2 <1 olduğundan Y alanını almalıyız, bu nedenle Y [0, 1) aralığındadır. Y'nin pdf'sinin gerçekten bir pdf olup olmadığını kontrol etmek isterseniz, onu etki alanı üzerine entegre edin: 1 / (2 sqrt (y)) 0'dan 1'e entegre edin ve gerçekten de 1 olarak açılır. Ayrıca, adı geçen işlev, inançlı yayınlanmış gibi görünür.

X 1 + X 2 + ... + X n gibi (X i ~ Düzgün [0,1]) gibi şeylere gelince , sadece momentleri olan herhangi bir dağıtım için çalışan Merkezi Limit Teoremine itiraz edebiliriz. Bu yüzden Z testi gerçekten var.

Elde edilen pdf'yi belirlemek için diğer teknikler arasında Jacobian dönüşümü (cdf tekniğinin genelleştirilmiş versiyonu olan) ve MGF tekniği yer alır.

DÜZENLEME: Bir açıklama olarak, rastgele dönüşümden değil, ortaya çıkan dönüşümün dağılımından bahsettiğimi unutmayın . Bu aslında ayrı bir tartışma için. Ayrıca aslında elde ettiğim şey (rand ()) ^ 2 içindi. Rand () * rand () için, çok daha karmaşıktır, bu da, her durumda, herhangi bir türün düzgün bir şekilde dağılmasına neden olmaz.


9

Tam olarak açık değil, ama rand()genellikle daha rastgele rand()*rand(). Önemli olan, bunun çoğu kullanım için aslında çok önemli olmamasıdır.

Ama önce farklı dağıtımlar üretiyorlar. İstediğiniz bu ise bu bir problem değildir , ama önemli. Belirli bir dağıtıma ihtiyacınız varsa, “daha ​​rasgele olan” sorunun tamamını görmezden gelin. Öyleyse neden rand()daha rastgele?

Nedenin özü rand()daha rasgele (çok yaygın olan [0..1] aralığıyla kayan nokta rasgele sayılar ürettiği varsayımı altında), iki FP numarasını mantis içindeki birçok bilgi ile birlikte çarptığınızda, sondan biraz bilgi kaybı; bir IEEE çift kesinlikli şamandırada, [0..1] 'den rastgele seçilen iki IEEE çift kesinlikli şamandıradaki tüm bilgileri tutmak için yeterli bit yoktur ve bu ekstra bilgi parçaları kaybolur. Tabii ki, o kadar önemli değil çünkü (muhtemelen) bu bilgiyi kullanmayacaksınız, ancak kayıp gerçek. Ayrıca hangi dağıtımı yaptığınız (yani, kombinasyonu yapmak için hangi işlemi kullandığınız) önemli değildir. Bu rastgele sayıların her birinde (en iyi) 52 bit rastgele bilgi vardır -

Rastgele sayıların çoğu kullanımı, rastgele kaynakta mevcut olan kadar rastgele kullanılmaz. İyi bir PRNG alın ve bu konuda fazla endişelenmeyin. (“İyilik” seviyesi onunla ne yaptığınıza bağlıdır; Monte Carlo simülasyonu veya kriptografi yaparken dikkatli olmanız gerekir, ancak aksi takdirde standart PRNG'yi genellikle daha hızlı olduğu için kullanabilirsiniz.)


1
Bu cevabın belisarius'un muhteşem cevabı ile birlikte okunması gerekiyor; sorunun farklı yönlerini kapsarlar.
Donal Fellows

7

Değişken rasgele, genel olarak, sıfır ile belirli bir aralık arasında bir tamsayı üreten bir algoritmaya dayanır. Bu nedenle, rand () * rand () kullanarak, aslında int_rand () * int_rand () / rand_max ^ 2 diyorsunuz - yani herhangi bir asal sayı / rand_max ^ 2'yi hariç tuttunuz.

Bu randomize dağılımı önemli ölçüde değiştirir.

rand () çoğu sistemde eşit olarak dağılmıştır ve düzgün tohumlandığını tahmin etmek zordur. Üzerinde matematik yapmak için belirli bir nedeniniz yoksa (yani, dağılımı gerekli bir eğriye göre şekillendirmek) kullanın.


@belisarius: Bu sadece 1 rastgele sürecin olası bir sonucuysa geçerlidir.
Joris Meys

Bunu bulamadan önce cevapları çok aşağı okumalıydım. Net bir sorun belirtiyorsunuz : sonuç alanı (olası değerlerin sayısı) rand()*rand(), sonuç rand()sayılarından daha küçük - çünkü asal sayıları hariç tutuyor. Benim oyumu alır ...
Floris

7

Sayıları çoğaltmak, bilgisayar mimarinize bağlı olarak daha küçük bir çözüm aralığında sonuçlanır.

Bilgisayarınızın ekranı 16 basamak gösteriyorsa rand()0.1234567890123 saniyeyle çarpılır rand(), 0.1234567890123, deneyi 10 ^ 14 kez tekrarlarsanız kesinlikle daha az çözüm bulacağınız 0.0152415 bir şey verir.


3

Bu dağılımların çoğu, rasgele sayıyı sınırlamanız veya normalleştirmeniz gerektiği için gerçekleşir.

Tümünün pozitif olmasını, bir aralığa sığmasını ve hatta atanan değişken türü için bellek boyutunun kısıtlamalarına uymasını normalleştiririz.

Diğer bir deyişle, rastgele çağrıyı 0 ile X arasında sınırlamamız gerektiğinden (X değişkenimizin boyut sınırıdır) 0 ve X arasında bir grup "rastgele" sayıya sahip olacağız.

Şimdi rastgele sayıyı başka bir rastgele sayıya eklediğinizde, toplam 0 ile 2X arasında bir yerde olacaktır ... bu, kenar noktalarından değerleri çarpıtır (iki küçük sayıyı birbirine ekleme ve iki büyük sayıyı birlikte ekleme olasılığı çok küçük olduğunda geniş bir aralıkta iki rastgele sayınız var).

Sıfıra yakın bir sayıya sahip olduğunuz ve başka bir rastgele sayı ile eklediğiniz durumu düşünün, kesinlikle 0'dan büyük ve uzaklaşacaktır (bu büyük sayılar için geçerli olacak ve iki büyük sayıya sahip olma olasılığı düşüktür) (X'e yakın sayılar) Rastgele işlevi tarafından iki kez döndürülür.

Şimdi, rasgele yöntemi negatif sayılar ve pozitif sayılarla (sıfır eksenine eşit olarak yayılır) ayarlayacak olsaydınız, artık durum böyle olmazdı.

Diyelim ki RandomReal({-x, x}, 50000, .01)negatif sayıların eşit bir dağılımını elde edersiniz ve rasgele sayıları bir araya getirecek olursanız, onların "rasgeleliklerini" koruyacaklardır.

Şimdi Random() * Random()negatif ile pozitif açıklık ile ne olacağını emin değilim ... görmek ilginç bir grafik olurdu ... ama şimdi kod yazmaya geri dönmek zorunda. :-P


2
  1. Daha rastgele diye bir şey yoktur . Ya rastgele ya da değil. Rastgele "tahmin etmesi zor" anlamına gelir. Deterministik olmayan anlamına gelmez. Eğer random () rastgele ise hem random () hem de random () * random () eşittir. Rasgelelik gittikçe dağıtım da önemsizdir. Düzgün olmayan bir dağılım meydana gelirse, bu sadece bazı değerlerin diğerlerinden daha olası olduğu anlamına gelir; hala tahmin edilemez.

  2. Yalancı rasgelelik söz konusu olduğundan, sayılar çok belirleyicidir. Bununla birlikte, olasılık modelleri ve simülasyonlarında sözde rasgelelik genellikle yeterlidir. Sözde rasgele bir sayı üretecini karmaşık hale getirmenin sadece analiz etmeyi zorlaştırdığı oldukça iyi bilinmektedir. Rasgeleliğin geliştirilmesi olası değildir; genellikle istatistiksel testlerde başarısız olmasına neden olur.

  3. Rastgele sayıların istenen özellikleri önemlidir: tekrarlanabilirlik ve tekrarlanabilirlik, istatistiksel rasgelelik, (genellikle) eşit olarak dağılmış ve büyük bir süre azdır.

  4. Rastgele sayılardaki dönüşümlerle ilgili olarak: Birisinin söylediği gibi, iki veya daha fazla eşit dağılmış toplam, normal bir dağılımla sonuçlanır. Bu, ilave merkezi limit teoremidir. Tüm dağıtımlar bağımsız ve özdeş olduğu sürece, kaynak dağılımından bağımsız olarak uygulanır. çarpımsalmerkezi limit teoremi, iki veya daha fazla bağımsız ve girintili olarak dağıtılmış rastgele değişkenin çarpımının lognormal olduğunu söylüyor. Başka birinin oluşturduğu grafik üstel görünüyor, ama gerçekten lognormal. Böylece random () * random () lognormal olarak dağıtılır (sayılar aynı akıştan çekildiğinden bağımsız olmayabilir). Bu, bazı uygulamalarda arzu edilebilir. Bununla birlikte, rastgele bir sayı üretmek ve lognormal olarak dağıtılmış bir sayıya dönüştürmek genellikle daha iyidir. Random () * random () 'nin analizi zor olabilir.

Daha fazla bilgi için www.performorama.org adresindeki kitabımı ziyaret edin. Kitap yapım aşamasında, ancak ilgili materyal var. Bölüm ve bölüm numaralarının zamanla değişebileceğini unutmayın. Bölüm 8 (olasılık teorisi) - bölüm 8.3.1 ve 8.3.3, bölüm 10 (rastgele sayılar).


1

Kolmogorov karmaşıklığını kullanarak rastgele sayılarla ilgili iki sayı dizisini karşılaştırabiliriz. Sayı dizisi sıkıştırılamazsa, bu uzunlukta ulaşabileceğimiz en rastgele değerdir ... Bu tür bir ölçümün daha teorik olduğunu biliyorum seçenek ...


1

Bu konuda Aslında, ne zaman düşünmek rand() * rand()olduğunu az daha rastgele rand(). İşte nedeni.

Esasen, çift sayılarla aynı sayıda tek sayı vardır. Ve 0.04325'in tek olduğunu ve 0.388 gibi çift olduğunu ve 0.4'ün çift olduğunu ve 0.15'in tek olduğunu söyleyerek,

Bu rand(), eşit veya tek bir ondalık olma şansının eşit olduğu anlamına gelir .

Öte yandan, rand() * rand()oranları biraz farklı yığılmış mı? Diyelimki:

double a = rand();
double b = rand();
double c = a * b;

ave bher ikisinin de eşit veya tek olma şansı% 50'dir. Bilerek

  • çift ​​* çift = çift
  • çift ​​* tek = çift
  • tek * tek = tek
  • tek * çift = çift

% 75'lik bir şansın var colduğu anlamına gelir, sadece % 25'lik bir oran gariptir, bu da değerini rand() * rand()daha tahmin edilebilir rand(), dolayısıyla daha az rastgele yapar.


rand()genellikle 0 ile 1 arasında bir sayı verir. Düzgün veya tek olup olmadığı hakkında konuşmak anlamlı mı?
Teepeemm

1
Aslında, 0.2*0.2=0.04bu yaklaşımla temel bir kusur ortaya koyuyor: iki bitlik 53 bitin çarpılması sonuçta yaklaşık 100 bit verecektir. Ancak bu bitlerin son yarısı atılır. Bu nedenle, en az anlamlı biti olarak 1 ile iki katına çıktığınızda, ürünlerinin en az önemli biti hakkında hiçbir şey söyleyemezsiniz.
teepeemm

Ya da başka bir deyişle, dağıtım için anlamlı rand()olan "çift" ve "tek" tanımının dağıtım için anlamlı olan "çift" ve "tek" tanımları ile aynı olduğunu varsaydınız. / rand()*rand(). Durum böyle değilse, bu argüman başarısız olur. Bu tamsayılar için doğrudur, ancak bunlar tamsayı değildir.
David Schwartz

0

İlkel bir polinom uygulayan doğrusal bir geri bildirim kaydırma yazmacı (LFSR) kullanın.

Sonuç, 2 ^ n yalancı rasgele sayılar dizisi olacaktır, yani n, LFSR .... 'deki bit sayısıdır.

http://en.wikipedia.org/wiki/Linear_feedback_shift_register http://www.xilinx.com/support/documentation/application_notes/xapp052.pdf

Bilgisayar saatinizin mikroseküllerine dayalı bir "rastgele" tohum veya dosya sisteminizdeki sürekli değişen verilerde md5 sonucunun bir alt kümesi kullanın.

Örneğin, 32 bit LFSR, belirli bir tohumla başlayarak sırayla 2 ^ 32 benzersiz sayı üretecektir (2 değil). Dizi her zaman aynı sırada olacaktır, ancak başlangıç ​​noktası farklı bir tohum için farklı olacaktır (belli ki). Bu nedenle, fideler arasında tekrarlanan bir dizi sorun değilse, bu iyi bir seçim olabilir.

Sürekli değişen sistem verilerinin md5 sonuçları olan bir tohum kullanarak donanım simülatörlerinde rastgele testler oluşturmak için 128 bit LFSR'ler kullandım.


0

Varsayarsak rand()arasında bir sayı döndürür [0, 1)buna açıktır rand() * rand()çarparak Bunun nedeni 0. karşı önyargılı olacak xarasında bir sayı [0, 1)daha küçük bir sayı ile sonuçlanacaktır x. İşte 10000 dağılımı ise daha rasgele sayı:

Eğer rand()bir tamsayı döndürürse, [x, y]o zaman aşağıdaki dağılıma sahip olursunuz. Tek ve çift değerlerin sayısına dikkat edin:


-1

Tamam, bu yüzden rastgele bir sayı üreteci oluşturduğunuzu ve kullandığınızı söyleyerek başkalarının cevaplarını tamamlamak için biraz değer katmaya çalışacağım.

Rastgele sayı üreteçleri, bir amaca uyacak şekilde değiştirilebilen çoklu özelliklere sahip cihazlardır (çok genel anlamda). Bazıları (benden):

  • Entropi: Shannon Entropisinde olduğu gibi
  • Dağıtım: istatistiksel dağılım (poisson, normal, vb.)
  • Tür: numaraların kaynağı nedir (algoritma, doğal olay, kombinasyonu vb.) Ve uygulanan algoritma.
  • Verimlilik: hızlılık veya yürütmenin karmaşıklığı.
  • Desenler: periyodiklik, sekanslar, koşular vb.
  • ve muhtemelen daha fazlası ...

Buradaki çoğu cevapta, dağıtım ana ilgi noktasıdır, ancak işlevler ve parametreler karıştırılarak ve eşleştirilerek, bazıları ilk bakışta değerlendirmenin belli olmayabileceği farklı özelliklere sahip rastgele sayılar üretmenin yeni yollarını yaratırsınız.


-1

İki rastgele sayının toplamının mutlaka rastgele olmadığını göstermek kolaydır. 6 taraflı bir kalıp ve rulo olduğunu düşünün. Her sayının 1/6 oranında görünme şansı vardır. Şimdi 2 zarın olduğunu ve sonucu topladığını söyle. Bu meblağların dağılımı 1/12 değildir. Neden? Çünkü belirli sayılar diğerlerinden daha fazla görünür. Bunların çoklu bölümleri vardır . Örneğin, 2 sayısı yalnızca 1 + 1'in toplamıdır, ancak 7, 3 + 4 veya 4 + 3 veya 5 + 2 vb.

Bu nedenle, bir dönüşüm uygulamak, bu durumda rastgele bir işleve eklemek onu daha rastgele yapmaz veya zorunlu olarak rasgele korumayı sağlamaz. Yukarıdaki zar durumunda, dağılım 7'ye çarpıktır ve bu nedenle daha az rasgele.


-1

Diğerlerinin de belirttiği gibi, bu soruya cevap vermek zordur, çünkü hepimizin kafasında kendi rasgelelik resmi vardır .

Bu nedenle, biraz zaman ayırmanızı ve rastgele bir site hakkında daha iyi bir fikir edinmek için bu siteyi okumanızı şiddetle tavsiye ederim:

Gerçek soruya geri dönmek için. Bu terimde az çok rasgele yok:

her ikisi de sadece rastgele görünüyor !

Her iki durumda da - sadece rand () veya rand () * rand () - durum aynıdır: Birkaç milyar sayıdan sonra sıra tekrarlanır (!) . Bu görünen o tüm diziyi bilmediği için, gözlemci rasgele, ancak bilgisayar vardır hiçbir gerçek rasgele kaynağı - o da rastgeleliğine üretemez böylece.

örneğin: Hava durumu rastgele mi? Havanın rastgele olup olmadığını belirlemek için yeterli sensöre veya bilgiye sahip değiliz.


-2

Cevap şu olabilir, umarım rand () * rand () rand () 'dan daha rastgele olurdu, ama şöyle:

  • her iki cevap da değerinizin bit büyüklüğüne bağlıdır
  • çoğu durumda sözde rasgele bir algoritmaya (çoğunlukla bilgisayar saatinize bağlı olan ve bu kadar rasgele değil bir sayı üreteci) bağlı olarak ürettiğinizdir.
  • kodunuzu daha okunabilir hale getirin (ve bu tür mantralarla rastgele rastgele voodoo tanrısını çağırmayın).

Eğer yukarıdaki herhangi birini kontrol ederseniz ben basit "rand ()" için gitmek öneririz. Kodunuz daha okunabilir olacağından (neden bunu yazdığınızı kendinize sormazsınız, çünkü ... iyi ... 2 saniyeden fazla), bakımı kolay (rand işlevini bir super_rand ile değiştirmek isterseniz).

Daha iyi bir rastgele istiyorsanız, yeterli gürültü ( radyo statik ) sağlayan herhangi bir kaynaktan akışla oynamanızı tavsiye ederim ve sonra basit bir rand()şey yeterli olmalıdır.

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.