Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: Sorteggi casuali

  1. #1

    Sorteggi casuali

    Salve,
    dovrei scrivere un codice per dei sorteggi casuali. La tabella delle squadre è così strutturata:

    tid (team id)
    cid (clan id, ogni team è contenuto in un clan)

    e altri campi che non interessano questo script.
    Ora dovrei creare gironi da 4 squadre (il conteggio dei team per la suddivisione dei team l'ho già fatto) che non abbiano il cid uguale e tutto totalmente in modo casuale.
    Mi ci sto scervellando da molto e non so se per mia negligenza di alcune funzioni, ma non riesco a venirne a capo.
    Ho provato facendo una selezione random ripetuta con un limit che mi permettesse di selezionare 4 team alla volta, ma molte volte accade che per via della selezione random, mi seleziona team già sorteggiati. Dovendo poi essere tutto stampato senza salvare nulla in alcun db, è un bel problema. Come posso fare per evitare questo?

  2. #2
    Cerca la selezione random senza ripetizione, troverai molte cose a riguardo

  3. #3
    Originariamente inviato da fdisotto
    Cerca la selezione random senza ripetizione, troverai molte cose a riguardo
    Cioè? Non dico di essere esperto in PHP, ma qualcosa ne capisco. Di SQL proprio no, quindi non capisco cosa intendi...

  4. #4
    Quando fai una selezione random può essere di due tipi, con ripetizione e senza ripetizione. Con ripetizione c'è la possiblità di ripescare valori già presi, senza ripetizione invece no

  5. #5
    Non ne vengo a capo. Ho provato a cercare una guida su questa funzione rand di sql, ma l'unica cosa sensata che ho trovato è la pagina microsoft italianizzata in modo pessimo.
    Ho quindi pensato di fare un confronto utilizzando mysql_result (so che la funzione verrà deprecata, ma tanto lo script deve essere lanciato fra due settimane e basta) in due for annidati. Ma non riesco a scrivere una condizione del secondo for che vada bene

    Codice PHP:
    /* Seleziono i team iscritti */
    $teamIscritti_s$db->query("SELECT * FROM team WHERE torneo = 6 ORDER BY RAND()") or die(mysql_error());
    $j=1;
    while (
    $team $db->fetch_array($teamIscritti_s)
    {

        echo 
    "Girone $j
    "
    ;
        for (???) 
            {
                }
        
    $j++;

    L'intenzione era quella di fare nel while la suddivisione in TOT gironi ed utilizzare la variabile TOT per la condizione del for, il quale dovrebbe ripetersi per 3 volte (primo/secondo, secondo/terzo, terzo/quarto e per riflessività, nessuno dovrebbe essere uguale all'altro)

  6. #6
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Devi generare tutto il calendario?
    In tal caso non è semplice come stai pensando tu, per ogni giornata devi anche ricordarti ogni squadra quale altra ha incontrato in modo che nei sorteggi successivi non vengano nuovamente associate.

  7. #7
    Ti ringrazio per la risposta.

    Comunque il risultato non deve essere un calendario, ma più semplice, l'organizzazione dei gironi (dati tot team, mi deve creare tot/4 gironi in cui non deve essere presente un team dello stesso clan). Soltanto i sorteggi dei gironi, senza dover fare il calendario.

  8. #8
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Ogni clan ha lo stesso numero di squadre e il numero di clan è un multiplo di 4?
    Oppure non c'è certezza su numero di clan e di squadre all'interno dei vari clan?

  9. #9
    Ogni clan può avere un massimo di 4 squadre (scusate ma mi ero dimenticato anche io di questo) iscritte al torneo.
    La tabella è sempre

    tid (id del team)
    cid (id del clan di cui fa parte il team)

    Devo contare i team, creare, di conseguenza, TOT gironi e in ogni girone non deve essere presente più di un team dello stesso clan.

  10. #10
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Non l'ho provato e potrebbe esserci qualche errore, di certo si potrebbe ottimizzare, ma l'ho tirato giù al volo e dovrebbe comunque aiutarti nella soluzione.
    Codice PHP:
    //per brevità suppongo che le variabili associate alle query
    //siano nei formati pronti da usare (array, interi, stringhe...)

    $clans        $db->query('SELECT DISTINCT cid FROM team');
    $num_clans    $db->query('SELECT count(DISTINCT cid) AS num FROM team');

    $num_gironi ceil($num_clans/4);

    $i 1;
    foreach (
    $calns as $clan//un array per ogni clan
    {
        
    $squadre $db->query('SELECT tid FROM team WHERE cid='.$clan);
        
        
    $squadre_clan[$i] = array();
        foreach  (
    $squadre as $squadra)
        {
            
    //inserisco la squadra nell'array del clan
            
    $squadre_clan[$i][] = $squadra;
            
            
    //metto in ordine casuale le squadre del clan
            
    shuffle($squadre_clan[$i]);
        }
        
        
    $i++;
    }

    for (
    $i=0$i<$num_gironi$i++) //costruisco i gironi
    {
        
    $clan_selezionati = array();
        
    $girone[$i] = array();
        
        
    //conta quante squadre ho inserito nel girone
        
    $j 0;
        while (
    $j 4)
        {
            
    //sorteggio a caso un clan
            
    $clan rand(1,$num_clans);
            
            
    //se non ho ancora preso questo clan nel girone in costruzione
            
    if ( ! in_array($clan,$clan_selezionati) )
            {
                
    //se nel clan ci sono ancora quadre
                
    if ( ! empty($squadre_clan[$clan]) )
                {
                    
    //aggiungo la squadra al girone e la rimuovo dall'array del clan per non riprenderla
                    
    $girone[$i][] = array_pop($squadre_clan[$clan]);
                    
                    
    //inserisco il clan tra i clan selezionati in questo girone
                    
    $clan_selezionati[] = $clan;
                    
                    
    //è stata aggiunta una squadra al girone
                    
    $j++;
                }
            }
        }
    }

    echo 
    "<pre>";
    print_r($girone);
    echo 
    "</pre>"

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.