Ik heb nog altijd het vermoeden dat rand() niet random is, iig, niet volledig random.

Na mijn vorige experiment (let vooral op de totalen onderaan) heb ik nu een nieuw experiment bedacht. Een plaatje.

Ik geef de opdracht (source) om met x = rand(0, 500) en y= rand(0, 500) een plaatje pixel voor pixel in te kleuren. Daarna tel ik de witte pixels. Nu valt het me op dat het aantal witte pixels altijd 36% is. Nooit meer, nooit minder, op een paar getallen achter de komma na.

Nog erger, op mijn eigen computer had ik laatst een plaatje met een volledig raster erin. Je zag gewoon de knooppunten. Helaas had ik het niet opgeslagen.

Altijd 36%, wat voor conclusie mag ik daaruit trekken? Dat het aantal keer dat x en y al eerder samen zijn voorgekomen dus 36% is. Maar waarom nooit 37% laat staan 45%?

Maar dit is een van mijn gemiddelde resultaten:
Met rand() krijg ik altijd zo'n afbeelding:


Met mt_rand() altijd een afbeelding als deze:



Kunnen we hieruit conclusies trekken of moeten we een grotere steekproef uitvoeren? Dan regel ik een server die we een paar uur gaan aanzetten...


Nog grotere afbeeldingen zou ook getest kunnen worden, of afbeeldingen van verschillend formaat.


**bump**
Hmmm... idd
Met rand krijg ik ook 93% en met mt_rand 36%
Ik heb windows 2000 met php 5...
Mijn hypothese:

rand() maakt dus waarschijnlijk gebruik van de random-functie van het besturingssysteem, en mt_rand() van een functie in PHP zelf.

En ieder besturingssysteem heeft een andere interpretatie van wat rand() moet doen, dus is PHP overal verschillend.

Maar ze hebben een ding met elkaar gemeen: de uitkomst is iedere keer hetzelfde, de volgorde is alleen anders. Op zich wiskundig gezien heel logisch, maar niet volstrekt random.
Maar waarom zit er in rand() zo'n regelmatig patroon?

En heb jij dat script uitgevoerd met rand() en niet met mt_rand()? Wat mij namelijk opvalt dat jij zegt dat je rand() hebt gebruikt en net zulke plaatjes en procenten krijgt, als de windows gebruikers met mt_rand().
mt_rand() is blijkbaar dezelfde functie als die die standaard in Unix/Linux besturingssystemen zit. (Ik heb alleen getest op PHP5, Mac OS X 10.4.6 en een (debian?) linux server, die van m'n host, ook PHP5)
Een tijdje geleden heb ik deze snippet gemaakt:

<?php
function bool_rand($procent)
{
if ($procent >= 0 && $procent <= 100) {
$toeval = mt_rand(0, 100);
return $toeval <= $procent;
} else {
return false;
}
}
?>

@ Jelmer: Je kunt hem een percentage voeren. Als je heb bijv 50 meegeeft zou het net zo vaak true als false moeten retourneren. Welk getal moet jij hem meegeven om een goed random resultaat te krijgen?
Als ik de cijfers zo even snel bekijk, zou ik zeggen dat de functie mt_rand zich gedraagt zoals het hoort. Dan moet het iets anders zijn in je script.
Ik heb nog eens naar je script gekeken:

1) je berekent het aantal pixels in je plaatje
2) die zet je in een loop en dan pak je een willekeurig x en y en die geef je een kleurtje

De verwachting dat de helft van de pixels gekleurd zou moeten worden klopt niet. Je aantal pogingen is net zo groot als het aantal pixels dus mag je een aantal verdubbelingen verwachten. Dat blijkt standaard net ruim éénderde te zijn van het aantal pogingen. Daar is vast een formule voor, maar die zou ik je niet kunnen geven.

edit: dat je steeds op 36% uitkomt, heeft denk ik te maken met het grote aantal pogingen dat je doet:

500 * 500 = 250000

in de kansbereking worden uitkomsten voorspelbaarder naarmate het aantal pogingen toeneemt.

Reageren