PDA

Bekijk Volledige Versie : Willekeurige foto



Gaafy
13/02/03, 17:45
Hoi,

Ik gebruik de volgende code om een willekeurige foto te kiezen:

// Kies een willekeurige foto
$random = mysql_fetch_array(mysql_query("SELECT id FROM photo ORDER BY
RAND() LIMIT 0, 1"));

Nu komt er echter 9 v.d. 10 keer foto "1" als uitkomst.
Wat kan ik hier aan doen?

Gaafy

Ronald Paul
13/02/03, 18:05
Gaafy <gaafy@hotmail.com> schreef:

>Ik gebruik de volgende code om een willekeurige foto te kiezen:
>
>// Kies een willekeurige foto
>$random = mysql_fetch_array(mysql_query("SELECT id FROM photo ORDER BY
>RAND() LIMIT 0, 1"));
>
>Nu komt er echter 9 v.d. 10 keer foto "1" als uitkomst.
>Wat kan ik hier aan doen?

list(, $random) = mysql_fetch_array(mysql_query("[..]"));

Ongetest.

--
Groet, Ronald

Ronald Klip
13/02/03, 18:15
Ronald Paul schreef:
> Gaafy <gaafy@hotmail.com> schreef:
>
> >Ik gebruik de volgende code om een willekeurige foto te kiezen:
> >
> >// Kies een willekeurige foto
> >$random = mysql_fetch_array(mysql_query("SELECT id FROM photo ORDER BY
> >RAND() LIMIT 0, 1"));
> >
> >Nu komt er echter 9 v.d. 10 keer foto "1" als uitkomst.
> >Wat kan ik hier aan doen?
>
> list(, $random) = mysql_fetch_array(mysql_query("[..]"));
>
> Ongetest.

Alternatief: eerst alle id's ophalen en in een array stoppen, en daar
vervolgens een willekeurig item uithalen.

srand ((float) microtime() * 10000000);
$eenID = array_rand ($alleIDs);

Dat id gebruik je (OP) in een tweede select-query.

Wel getest.

--
groet, Ronald

uws
13/02/03, 18:15
I <b2ge8s$2cf0$1@nl-news.euro.net>, Gaafy skrev:
> $random = mysql_fetch_array(mysql_query("SELECT id FROM photo ORDER BY
> RAND() LIMIT 0, 1"));
> Nu komt er echter 9 v.d. 10 keer foto "1" als uitkomst.

Dat komt omdat je een array opvraagt, en niet een item daaruit.

--
uws mail uws@xs4all.nl

soon i know i'll be back with you :: i'm nearly with you -- zero 7

Gaafy
13/02/03, 20:15
uws heeft geschreven:
> I <b2ge8s$2cf0$1@nl-news.euro.net>, Gaafy skrev:
>
>>$random = mysql_fetch_array(mysql_query("SELECT id FROM photo ORDER BY
>>RAND() LIMIT 0, 1"));
>>Nu komt er echter 9 v.d. 10 keer foto "1" als uitkomst.
>
> Dat komt omdat je een array opvraagt, en niet een item daaruit.

Ja, dat snap ik, maar in die array zit maar 1 item (LIMIT 0,1) en dat
zou door RAND() toch variabel moeten zijn?

Gaafy
--
http://www.gaafy.nl

Ronald Klip
13/02/03, 21:45
Gaafy schreef:
> uws heeft geschreven:
> > I <b2ge8s$2cf0$1@nl-news.euro.net>, Gaafy skrev:
> >
> >>$random = mysql_fetch_array(mysql_query("SELECT id FROM photo ORDER BY
> >>RAND() LIMIT 0, 1"));
> >>Nu komt er echter 9 v.d. 10 keer foto "1" als uitkomst.
> >
> > Dat komt omdat je een array opvraagt, en niet een item daaruit.
>
> Ja, dat snap ik, maar in die array zit maar 1 item (LIMIT 0,1) en dat
> zou door RAND() toch variabel moeten zijn?

Het ligt niet aan je query. Die methode geeft veel te vaak de eerste rij
uit de tabel terug.

"RAND() is not meant to be a perfect random generator, [...]"

http://www.mysql.com/doc/en/Mathematical_functions.html#IDX1250

--
groet, Ronald

Ronald Paul
14/02/03, 02:35
Ronald Klip <ronald@bladibla.njet> schreef:

>Het ligt niet aan je query. Die methode geeft veel te vaak de eerste rij
>uit de tabel terug.
>
>"RAND() is not meant to be a perfect random generator, [...]"
>
>http://www.mysql.com/doc/en/Mathematical_functions.html#IDX1250

Geen enkele random-functie uit welke taal dan ook is zo bedoeld, tot
voor kort althans. Het wordt steeds makkelijker om van ruis van
buitenaf wel perfecte random getallen te genereren. Maar dat even
terzijde.

Ik heb even een poging gedaan om uit te zoeken wat nou de meest
random-methode was. MySQL's ORDER BY RAND() (1) of PHP's array_rand()
(2), en heb daarvoor hetvolgende scriptje geschreven:

http://rcpaul.nl/usenet/mysqlrand.txt

Methode 2 is bij 100 iteraties zuiverder (ik heb geen idee of ik deze
term goed heb toegepast, maar het gaat even om het idee), maar bij
1000 iteraties is methode 1 weer duidelijk zuiverder. Er is dus geen
duidelijk verschil in de randomheid van de twee methode's en het is
zeker niet zo dat de query die de OP gebruikt niet random genoeg is.
Intern zullen beide methoden wel neerkomen op het gebruik van dezelfde
functie van de standard C library waarbij de verschillen worden
veroorzaakt door de verschillende momenten waarop wordt geseed.

--
Groet, Ronald

Ronald Klip
14/02/03, 12:25
Ronald Paul schreef:
>
> Ik heb even een poging gedaan om uit te zoeken wat nou de meest
> random-methode was. MySQL's ORDER BY RAND() (1) of PHP's array_rand()
> (2), en heb daarvoor hetvolgende scriptje geschreven:
>
> http://rcpaul.nl/usenet/mysqlrand.txt
>
> Methode 2 is bij 100 iteraties zuiverder (ik heb geen idee of ik deze
> term goed heb toegepast, maar het gaat even om het idee), maar bij
> 1000 iteraties is methode 1 weer duidelijk zuiverder. Er is dus geen
> duidelijk verschil in de randomheid van de twee methode's en het is
> zeker niet zo dat de query die de OP gebruikt niet random genoeg is.
> Intern zullen beide methoden wel neerkomen op het gebruik van dezelfde
> functie van de standard C library waarbij de verschillen worden
> veroorzaakt door de verschillende momenten waarop wordt geseed.

Ik heb je test hier nagebootst, en kom tot dezelfde conclusie. Misschien
wordt het afbeelden van een willekeurig plaatje verstoord door caching.

Ter info: ik lees net in de manual dat het vanaf PHP 4.2.0 niet meer
nodig is de random-nummer-generator te seeden.

--
groet, Ronald

uws
14/02/03, 13:55
I <MPG.18b6e0c01da570f8989ac5@nl-news.euro.net>, Ronald Klip skrev:
> [knip: random gedoe]

Is het niet gewoon veel zuiverder om een byte op te vragen uit
/dev/urandom? Volgens mij is die namelijk een stuk willekeuriger dan de
functionaliteit die PHP en mySQL bieden...

--
uws mail uws@xs4all.nl

who's gonna take it like this? :: no way :: you are, you are -- gomez