Avatar billede sylvesternielsen Nybegynder
07. februar 2005 - 16:01 Der er 7 kommentarer og
1 løsning

Lotto udtrækning, vægtning i MySQL

Jeg har en tabel med to felter
id og billet

id er bare en alm id med auto_increment og billet er antallet af billetter der er på den id.

Jeg skal så lave et udtræk som returnere 1 id, men udtrækket skal ske med vægtning på antallet af billetter.

Hvordan gør jeg det lettest muligt?
Avatar billede coderdk Praktikant
07. februar 2005 - 17:26 #1
SELECT id, billet FROM tabel ORDER BY billet

?
Avatar billede fojensen Nybegynder
07. februar 2005 - 18:02 #2
lodtrækningen kan måske lade sig gøre med mysql's rand-funktion, men jeg føler mig mere tryg ved php's rand-funktion.

Jeg har selv lavet en tilsvarende opgave (hvor der vælges en tilfældig i database ud fra nogle prioriteringer), og det kan godt være at det kan gøres smartere, men det virker fint, og jeg har også testet rand-funktionen (ved f.eks at vælge 1000 gange tilfældigt på 100 muligheder) og den gør arbejdet OK.

efter at have kørt forespørgslen, eksempelvis "SELECT * FROM tabel" og efter at have dem smidt i arrayet $resultat
ser min løsning sådan ud:

for ($i=0;$i < count($resultat[$i]);$i++) {
  $billet_array[] = $resultat[$i] ; // overfører denne variabel til $billet_array
  if ($resultat[$i]['billet'] > 1) {  // hvis der ligger mere end en billet på nummeret
    $antal_billet = $resultat[$i]['billet'];
    for ($ii=1;$ii < $antal_billet;$ii++) {
      $billet_array[] = $resultat[$i] ;// dublikerer denne variabel til $billet_array
    }
  }
}

nu har jeg et array med alle billetterne, og kan nu lave lodtrækningen med rand()
$max_tal = count($billet_array);
$tal = rand(1, $max_tal);

løsningen med at danne et nyt array er måske lidt kringlet, men jeg hører gerne om smartere måder at dublikere billetterne på...

mvh Folmer
Avatar billede sylvesternielsen Nybegynder
08. februar 2005 - 12:31 #3
Ja det var også noget i den stil jeg havde lavet først, men tænkte at det kunne man lave smartere.
Avatar billede fojensen Nybegynder
08. februar 2005 - 17:26 #4
OK - så må du hellere afvise mit svar, og så holder vi sammen øje med om nogen har en mere enkel løsning.
Avatar billede sylvesternielsen Nybegynder
09. februar 2005 - 21:08 #5
Nej jeg tror nu du har ret i at der ikke er meget andet at gøre..

Men du bekræftede da min teori, så tak for det. =)
Avatar billede coderdk Praktikant
09. februar 2005 - 21:33 #6
Lidt sent, men her er mit løsningsforslag baseret på hvad jeg tror du vil.
$rows skal indeholde et array af rows fra databasen:

    $result = array();
    foreach ( $rows as $row )
    {
        $result = array_merge( $result, array_fill( 0, $row['billet'], $row['id'] ) );
    }

Nu har du et array med de vægte du ønsker, skal du trække tilfældige ud, vil jeg anbefale:

    shuffle( $result );

Og så bare tage dem ud fra en ende af du skal bruge ;)
Avatar billede fojensen Nybegynder
10. februar 2005 - 09:27 #7
smart løsning !

det varede lidt inden jeg forstod løsningen, men det nye og hidtil ukendte for mig var mulighederne med array_fill() - smart til dette...

shuffle() er jo også en god løsning til lodtrækning, fordi den blander giver arrayet nye nøgler i tilfældig række følge.

al mulig respekt for coderdk for en god og lærerig løsning - nu skammer jeg mig bare over at have fået points for min ringe medvirken...
mvh. Folmer
Avatar billede coderdk Praktikant
10. februar 2005 - 09:29 #8
heheh det er helt ok, bare glad for at kunne komme med lidt :) Points er jo trods alt kun for "sjov" :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester