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

Discussione: trovare valore

  1. #1

    trovare valore

    Salve a tutti,

    mi rivolgo a questo forum dove credo ci siano molti esperti di php per risolvere un problema che mi ha inkasinato la mente :

    Ho un database MySQL nel quale ho dei valori INTEGER, in particolare ho un VALMAX in una tabella e soprattutto in un'altra tabella una serie di valori in colonna (che chiamerò VALORI per semplicità).
    Ogni volta che clicco su un pulsantino SUBMIT in un FORM devo generare un numero random compreso fra 0 e VALMAX e devo però controllare che non esista nella colonna VALORI.

    Chiaramente se esiste me ne deve generare un'altro random fino a che non esiste.

    Credo che non sia tanto difficile, ma mi sono talmente inkasinato che non riesco a farlo.

    Grazie cmq a tutti in anticipo.

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    potresti fare (ci sono tanti modi, questo è un esempio di procedura e neanche la "migliore", ma abbastanza lineare):

    1. query per leggere valore VALMAX in $valmax
    2. query per leggere tutti i VALORI da mettere in un array ($valori)
    3. $r = rand(0, $valmax);
    4. while (in_array($r, $valori)) { $r = rand(0, $valmax); };

    assolutamente non è una procedura ottimizzata nè tanto meno molto corretta tecnicamente perchè in teoria il ciclo while può essere "infinito", ma in pratica può funzionare.

  3. #3
    fino al terzo punto ci sono, ma il il quarto che non riesco ad ottimizzare.
    Provo con l'esempio che mi hai fatto comunque e ti faccio sapere.

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    per il quarto punto: più che di ottimizzare si parla di rendere efficiente... per evitare il loop infinito potresti mettere dentro il while anzichè la generazione di un nuovo numero casuale una cosa del tipo: $r=$r+1; if $r>$valmax $r=0; fermo restando che bisogna essere sicuri che esista almeno un valore generabile.

  5. #5
    no, così mi darebbe un valore non casuale, ma facilmente rintracciabile da un utente, continuo con l'altra ipotesi.

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    no: il valore è "casuale" lo stesso perchè viene inizializzato fuori dal ciclo... matematicamente avresti una distribuzione non omogenea, ma comunque "casuale" dal punto di vista dell'utente (in pratica se viene fuori per esempio il numero 8 e poi il 15 e poi di nuovo l'8, verrebbe cambiato in 9, cioè uno dei due "più vicini")

  7. #7
    si credo che tu abbia ragione.

    Ho fatto le prove col while e per valmax piccoli va tutto bene, ma se valmax è già pari a 1000, il ciclo potrebbe far bloccare il browser.

    Comunque credo che funzioni...cerco di evitare cicli enormi col tuo seconde suggerimento, magari se ti va inseriscimi un codice e lo confronto col mio.

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    comunque puoi ciclare anche con molti valori... anche 1000 non è molto... per fare una stima occorre avere più informazioni (tipo il range di valori o altro)... penso che così possa andar bene.

  9. #9
    scusa il ritardo nel rispondere ma ho avutoun pò da fare.
    Il range di valori è al max 99999, ovvero a 5 cifre. che ne pensi ? può andar bene lo stesso ?

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    sì.... se vuoi fare una prova fai un ciclo "a vuoto" di prova tipo:

    Codice PHP:
    $m 100000$valmax=$m;
    $t1 time();
    $i 0;
    while (
    $i++<$m) { $r rand(0$valmax); };
    $t2 time();
    $s $t2-$t1;
    print 
    "Per $m cicli tempo trascorso: $s secondi"
    che mostra il tempo necessario nel caso pessimo.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.