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%?
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)
@ 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?
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.