[PHP] Absoluut random nummer

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi,

Ik wilde een functie schrijven voor een random nummer generator die altijd een
uniek nummer pakt. (oftewel geen dubbele)

Nou werkt het bijna, ik stuit alleen op het volgende probleem:
Hij zet alle gegenereerde waardes in de array $al_gedaan. Hij controleert of de random waarde al in de array voorkomt. Zoja, dan moet die de functie opnieuw uitvoeren.

Ik heb de volgende code:
http://home.pelders.net/test/random.php (refresh een aantal keer om te zien wat er fout gaat)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function random($random) {
    global $al_gedaan;
    if (!in_array($random_number = mt_rand(0, (count($random) - 1)), $al_gedaan)) {
        array_push($al_gedaan, $random_number);
        return($random_number);
    } else {
        echo "Fout: ".$random_number."<br>";
        random($random);
    }
}

$al_gedaan = array();
$rand_array = array();

$sql = "SELECT film_id FROM film WHERE 1";
$resultaat = mysql_query($sql) or die (mysql_error());

while($gegevens = mysql_fetch_array($resultaat)) {
    array_push($rand_array, $gegevens["film_id"]);
}

for ($i=1; $i <= 5; $i++) {
    echo "Nummer $i: ".@$rand_array[($rand = random($rand_array))]." - ".$rand."<br>";
}
print_r($al_gedaan);


Wie kan mij helpen?

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

Zou je misschien willen vertellen wat er mis gaat en waar? Want ik heb dat ding nu een keer of 10 gerefresht en ik zie niks mis gaan.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

Verwijderd

je moet er een timestamp bij betrekken, dan is hij ech 100% random
ff kijken of ik een voorbeeldje kan vinden, ik doe meestal een random met een timestamp en daar een md5 overheen en daar dan bijvoorbeelde de 1e 8 chracters van pakken :)

random voorbeeld code

[ Voor 16% gewijzigd door Verwijderd op 26-11-2003 11:03 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wat er fout gaat is dat die na een dubbel nummer zichzelf niet aanroept (dus opnieuw gaat uitvoeren met dezelfde parameters)
Dus dan komt er geen nummer uit (zou bij Fout: een dubbel nummer moeten komen te staan)

Acties:
  • 0 Henk 'm!

  • Terranca
  • Registratie: April 2000
  • Laatst online: 18:25
Verwijderd schreef op 26 november 2003 @ 12:03:
Wat er fout gaat is dat die na een dubbel nummer zichzelf niet aanroept (dus opnieuw gaat uitvoeren met dezelfde parameters)
Dus dan komt er geen nummer uit (zou bij Fout: een dubbel nummer moeten komen te staan)
Probeer eens:

} else {
echo "Fout: ".$random_number."<br>";
return random($random);
}

Dan returnt hij in ieder geval de waarde die hij krijgt van de recursieve aanroep van random().

Acties:
  • 0 Henk 'm!

Verwijderd

Waar heb je de random getallen voor nodig? Gaat het om de random eigenschappen of om de uniciteit? Als de random-eigenschappen goed moeten zijn moet je juist niet verbieden dat een getal 2x gebruikt kan worden (je werkt slecht met een eindig aantal significante bits), hier zijn hele goede algortimen voor die zichzelf (in alle practische gevallen) nooit herhalen en anders zijn er algortimen die redelijk random zijn en zichzelf pas na een gespecificeerd aantal herhalen (delphi random generator is hier een voorbeeld van; neemt alle waarden 2^32 waarden 1x aan en herhaalt zich dan)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op 26 november 2003 @ 13:19:
Waar heb je de random getallen voor nodig? Gaat het om de random eigenschappen of om de uniciteit? Als de random-eigenschappen goed moeten zijn moet je juist niet verbieden dat een getal 2x gebruikt kan worden (je werkt slecht met een eindig aantal significante bits), hier zijn hele goede algortimen voor die zichzelf (in alle practische gevallen) nooit herhalen en anders zijn er algortimen die redelijk random zijn en zichzelf pas na een gespecificeerd aantal herhalen (delphi random generator is hier een voorbeeld van; neemt alle waarden 2^32 waarden 1x aan en herhaalt zich dan)
Je hebt vrij weinig aan delphi in php 8)7

Ik wil graag 5 random rijen uit een database halen en die op het scherm plakken.
Ik wil graag voorkomen dat hij meer dan 1x dezelfde rij pakt. vandaar dus :7

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 26 november 2003 @ 14:36:
Je hebt vrij weinig aan delphi in php 8)7
Ik wil graag 5 random rijen uit een database halen en die op het scherm plakken.
Ik wil graag voorkomen dat hij meer dan 1x dezelfde rij pakt. vandaar dus :7
'k weet niet wat voor db je gebruikt, maar als het MySQL is, kun je natuurlijk ook MySQL zelf 5 random records laten kiezen 8)7 :
PHP:
1
SELECT * FROM table ORDER BY RAND() LIMIT 5

of voor MySQL > 3.23.52 :
PHP:
1
SELECT * FROM table ORDER BY RAND(NOW()) LIMIT 5

(RAND() heeft nu een seed nodig, anders komt steeds dezelfde serie naar boven)

Acties:
  • 0 Henk 'm!

  • bigben04
  • Registratie: December 2001
  • Laatst online: 30-08 20:47
Verwijderd schreef op 26 november 2003 @ 10:53:
PHP:
1
$sql = "SELECT film_id FROM film WHERE 1";
Een where-clause is niet verplicht, dus als je alle records wil hebben kan je gewoon
PHP:
1
$sql = "SELECT film_id FROM film";

doen. Zie ook http://www.mysql.com/doc/en/SELECT.html

[ Voor 20% gewijzigd door bigben04 op 26-11-2003 16:03 ]


Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Verwijderd schreef op 26 november 2003 @ 10:53:
Hoi,

Ik wilde een functie schrijven voor een random nummer generator die altijd een
uniek nummer pakt. (oftewel geen dubbele)

[...]
Als het goed is zitten in een random string welzeker dubbele characters :) Heb je toevallig cryptonomicon gelezen? Hierin wordt beschreven hoe een random nummer generator (een vrouw met blindoek) het random element weghaalt door de blindoek af te nemen en als ze een letter ziet die ze al heeft gehad; dan een ander pakt :)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate

Pagina: 1