PHP - rand (1,1000) = 1000 rand (1,1000) = rand (1,1000) olarak olası mı?

7 Cevap php

Bu PHP rastgele sayı üreten uygulamaya nasıl?

Ben bir evet ya da hayır hesaplamak istiyorsanız söyleyin. Everytime belirli bir olasılık yüzdesi (: Bu örnek için 0,05% diyelim) var.

I do:

$possibilities = 100 / $probabilityPercentage; //$possibilities = 2000
$yes = rand(1,$possibilities);

$yesCheck = $possiblities;            //OPTION 1
$yesCheck = rand(1,$possibilities);   //OPTION 2


($yesCheck == $yes) ? return true : return false;

Does it give the same results with either option?

7 Cevap

Veri kendisi için konuşsun.

Kod

vinko@parrot:~$ more rand.php
<?php

$randrandsum = 0;
$randconstsum = 0;
$count = 20;
for ($j = 0; $j < $count; $j++) {
        $randrand = 0;
        $randconst = 0;
        for ($i = 0; $i < 10000000; $i++ ){
                $a = rand(1,1000);
                $b = rand(1,1000);
                if ($a == $b) $randrand++;
        }
        for ($i = 0; $i < 10000000; $i++ ){
                $a = rand(1,1000);
                $c = 1000;
                if ($c == $a) $randconst++;
        }
        $randrandsum += $randrand;
        $randconstsum += $randconst;
        print ($j+1)." RAND-RAND: $randrand RAND-CONST: $randconst\n";
}
print "AVG RAND-RAND: ".($randrandsum/$count);
print " AVG RAND-CONST: ".($randconstsum/$count)."\n";
?>

Deneme için çalıştırma

vinko@parrot:~$ php rand.php
1 RAND-RAND: 10043 RAND-CONST: 10018
2 RAND-RAND: 9940 RAND-CONST: 10132
3 RAND-RAND: 9879 RAND-CONST: 10042
4 RAND-RAND: 9878 RAND-CONST: 9965
5 RAND-RAND: 10226 RAND-CONST: 9867
6 RAND-RAND: 9866 RAND-CONST: 9992
7 RAND-RAND: 10069 RAND-CONST: 9953
8 RAND-RAND: 9967 RAND-CONST: 9862
9 RAND-RAND: 10009 RAND-CONST: 10060
10 RAND-RAND: 9809 RAND-CONST: 9985
11 RAND-RAND: 9939 RAND-CONST: 10057
12 RAND-RAND: 9945 RAND-CONST: 10013
13 RAND-RAND: 10090 RAND-CONST: 9936
14 RAND-RAND: 10000 RAND-CONST: 9867
15 RAND-RAND: 10055 RAND-CONST: 10088
16 RAND-RAND: 10129 RAND-CONST: 9875
17 RAND-RAND: 9846 RAND-CONST: 10056
18 RAND-RAND: 9961 RAND-CONST: 9930
19 RAND-RAND: 10063 RAND-CONST: 10001
20 RAND-RAND: 10047 RAND-CONST: 10037
AVG RAND-RAND: 9988.05 AVG RAND-CONST: 9986.8

Yukarıdaki sonuçlar göz önüne alındığında tüm pratik amaçlar için, iki seçenek iki vakalarda beklenen 1/1000 'sonuç vererek, eşdeğer olduğunu söyleyebilirim.

1. Seçenek doğru olduğu garantilidir.

Ben 2. Seçenek doğru olup olmadığını söylemek için geri gün yeterli olasılık ve istatistik öğrenilen sanmıyorum.

Ben, ancak, bir o gerçekten nasıl rasgele bir fikir edinmek için, üzerinde test programları çalışan olmadan başkasının rasgele sayı üreteci güven ASLA gerektiğini öğrendin.

Senin durumunda, ben de seçenekler arasında birkaç milyon test durumları çalıştırmak ve Seçenek 2 Seçenek 1 benzer istatistikler ile geldi olup olmadığını görmek istiyorum.

Teorik olarak, evet, iki ifade doğru olma aynı Olasılık var. Bu PHP'nin rasgele sayı üreteci aslında rastgele varsayarak bulunuyor - bu değilse, bir başka daha muhtemel olacaktır.

En iyi yaklaşım, bir deney (yineleme binlerce) çalıştırın ve ne görmek olacaktır.

Evet, rand (1,1000) = 1000 rand (1,1000) = rand (1,1000) kadar muhtemeldir.

İki dices haddeleme düşünün. Eğer ilkini haddelenmiş sonra, olasılık haddelenmiş zaman, ikinci bir ilk eşit olacak nedir? 1/6.

Şimdi 1 ve 6 arasında bir sayı yazmak ve bir zar. Zar sadece yazdıklarını eşit olacak olasılığı nedir? 1/6.

IF rasgele sayı üreteci sonra her iki yaklaşım aynı sonucu üretmek gerçekten rastgele. Ancak, bilgisayar rasgele sayı üreteçleri mükemmel değildir. Ben kusurları maddeye yeterli şüphe ama kesin bilmek tek yolu onu denemek için - mümkün olduğunca uzun süre için bir test çalıştırmak ve olması gereken ne bir sapma olup olmadığını görmek. Sen en az rasgele sayı milyonlarca gerekir.

Bu doğrudan sorusunu sormaz, ama bunun yerine) (mt_rand bakmak isteyebilirsiniz. PHP belgelerine durumları:

Many random number generators of older libcs have dubious or unknown characteristics and are slow. By default, PHP uses the libc random number generator with the rand() function. The mt_rand() function is a drop-in replacement for this. It uses a random number generator with known characteristics using the » Mersenne Twister, which will produce random numbers four times faster than what the average libc rand() provides.

Dan http://www.php.net/manual/en/function.mt-rand.php.

En rastgele jeneratörler çalışmıyor yolu, çıkış gerçekten rastgele değil döndürülen değerleri rastgele ve dağıtılan görünmesi gereken bir algoritma dayalı değildir. Buna göre ben aslında arka arkaya iki kez aynı sayıda gerçek olasılık iki tamamen ilgisiz "rastgele jeneratörler" olsaydı gerçek dünyada bile daha az olduğunu düşünüyorum.

Edit: Ben php varsayılan rastgele nasıl çalıştığı hakkında hiçbir iç bilgi var dedi sahip.