Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25
  1. #1

    [Mysql] Estrazione record casuali non ripetuti

    Salve a tutti.
    Ho una base di dati con svariate migliaia di righe e devo estrarne un numero X (x è dell'ordine di grandezza delle decine, con circa 100 come valore massimo) in modo random.
    So che esiste ORDER BY RAND() LIMIT X ma vorrei sapere:

    1. ho la garanzia di non avere MAI righe ripetute per ogni estrazione? (Se qualcuno conoscesse qualche dettaglio implementativo di RAND() o qualche documentazione che spiega questa cosa gli sarei grato)
    2. la distribuzione dei numeri è "abbastanza" casuale? Vorrei evitare che escano sempre le solite righe o comunque con una grande prevalenza (c'è il modo di avere un'idea statistica o devo provare direttamente?)
    3. dalla vostra esperienza usare quell'istruzione sql è qualcosa che conviene fare? O mi suggerite qualcos'altro?

    edit: Uso php insieme a mysql

    So che l'argomento è strato trattato spesso nel forum ma non ho trovato post che mi tolgano i dubbi!
    Grazie a chi mi risponderà!
    Ultima modifica di Nunkij; 27-04-2017 a 20:12
    I dilettanti costruirono l'Arca, i professionisti il Titanic!

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    764
    Nel forum c'è una discussione recente che potrebbe aiutarti.
    Il consiglio è sempre quello di fare una ricerca prima di aprire un topic.
    http://forum.html.it/forum/showthrea...t=mysql+random

  3. #3
    Avevo letto quella discussione ma in realtà non è che risponda proprio alle mie domande.
    I dilettanti costruirono l'Arca, i professionisti il Titanic!

  4. #4
    Quote Originariamente inviata da Nunkij Visualizza il messaggio
    Avevo letto quella discussione ma in realtà non è che risponda proprio alle mie domande.
    Cosa manca?

  5. #5
    Beh a me interessava sapere un po' come funzionano all'interno queste istruzioni per essere certo di avere una distribuzione abbastanza casuale. Là dice "usa queste" e anche l'autore del post si ritrova col problema di avere una piccola distribuzione.
    Inoltre non viene spiegato se posso avere o meno righe ripetute.
    I dilettanti costruirono l'Arca, i professionisti il Titanic!

  6. #6
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Pensa bene a questo: La casualità del caso

    Viene richiesta una estrazione di numeri casuale e non ripetuti ???
    Ma se non sono ripetuti non sono casuali !!!!

    Se vuoi una estrazione "pura" di numeri casuali allora devi accettare che alcuni escano 50 volte e altri escano 20 volte ( Per questo basta Rnd(...) )

    Statisticamente esiste una precisa curva di distribuzione della casualità che parte da zero con un picco in mezzo per poi ritornare a zero

    Nell'altro post e anche tu chiedete di avere un prelievo casuale, ma pero "più uniforme"
    quindi nell'altro post hai una delle 100.000 possibili proposte per orientare la casualità
    verso la uniformità (mi sento filosofo )

    Spiegaci meglio i dubbi e quello che vuoi ottenere con SQL

    .

  7. #7
    Beh faccio un esempio banale.

    Se uno volesse fare un sistema che assegna in modo puramente casuale una somma di denaro. Bisognerà accettare che qualcuno vinca più di una volta.
    Se uno volesse fare un sistema che assegna in modo casuale le domande a di un esame a uno studente, bisognerà essere certi che non ricapiti la stessa domanda.

    Sono due problemi "ugualmente" casuali.
    Per me la distribuzione di probabilità di uscita dei record è una curiosità o poco più ma ho l'esigenza di non avere record ripetuti. Rnd() me lo garantisce o devo un controllo successivo?

    D'altronde ricordo che c'erano algoritmi pseudocasuali che non ripetevano un numero prima dell'uscita di tutti quanti quindi la cosa non è infattibile.

    Grazie
    I dilettanti costruirono l'Arca, i professionisti il Titanic!

  8. #8
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    Quote Originariamente inviata da Nunkij Visualizza il messaggio
    [...]
    Se uno volesse fare un sistema che assegna in modo casuale le domande a di un esame a uno studente, bisognerà essere certi che non ricapiti la stessa domanda.
    [...]
    beh, se lo fai per una sola persona e usi una query ordinata su RAND() e prendi, ad esempio, i primi 10 record con LIMIT, la vedo molto difficile che ti esca due volte la stessa domanda nello stesso recordset restituito dalla query...

  9. #9
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Quote Originariamente inviata da Nunkij Visualizza il messaggio
    ........ ho l'esigenza di non avere record ripetuti. Rnd() me lo garantisce o devo un controllo successivo? ......
    Come ti dice clasku se fai una sola estrazione non ti puo capitare un record ripetuto

    ma pero se fai piu estrazioni allora certamente ti puo capitare

    Quindi tu devi estrarre casualmente escludendo i record gia estratti precedentemente

    L'unica idea che mi viene è quella di avere un campo specifico in tabella dove metti un flag ai record gia estratti
    chiaramente il random poi lo vai a pescare dai record senza flag


    Non credo che in MySql esista una procedura specifica
    ma dovrai creartela "artigianalmente"

    Per me assomiglia moltissimo al link del #2
    ma magari altri utenti avranno idee migliori,

    poi io conosco solo superficialmente MySql

    .

  10. #10
    estrazione random non tra tutti i record, ma solo tra quelli non ancora estratti (avrai quindi due tabelle in right outer join). l'estratto va poi ad aggiungersi alla tabella degli estratti. non c'è altro modo.

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.