Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    670

    Generare numeri casuali

    Ciao a tutti,
    devo mischiare 52 numeri (da 1 a 52) in ordine random.
    Come posso fare?
    Cioè il risultato dovrebbe essere tipo:

    32 10 5 52 14 23 47 ecc ecc

    praticamente tutti i 52 numeri mischiati anziché in fila 1 2 3 4 5 6
    ho dato uno sguardo alla funzione random. Però' non ho capito come "saltare" eventuali numeri già presi.

    Mi date un mano?
    Grazie mille!!!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Generare numeri casuali

    Originariamente inviato da ombra
    Però' non ho capito come "saltare" eventuali numeri già presi.
    Non devi "saltare" nulla.

    I numeri li avrai di certo in un array int[], giusto? Purtroppo nella classe di utilità java.util.Arrays non c'è uno shuffle() come invece esiste lo shuffle() per i List in java.util.Collections. Ma lo "shuffle" per un array di int lo puoi fare tu ed è anche semplice (anche concettualmente).

    Quale numero ci può andare nell'indice 0? Uno qualunque tra i 52, quindi estrai un numero casuale tra 0 e 51, metti es. 20, allora scambi i valori agli indici 0 e 20. Quindi il primo casuale è piazzato e il valore all'indice 0 non lo toccherai più.

    Una volta piazzato il primo, quale numero ci può andare nell'indice 1? Uno qualunque tra i restanti 51, quindi estrai un numero casuale tra 1 (!) e 51, metti es. 30, allora scambi i valori agli indici 1 e 30. Anche il secondo "casuale" è piazzato.

    Ecc....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Deduco tu debba creare un gioco di carte.

    Ti consiglierei di utilizzare ArrayList ma in caso tu non sappia usarli (è comunque relativamente semplice), puoi utilizzare un array ed implementare la ricerca binaria (nella classe Arrays è disponibile un metodo che fa al caso tuo)

    Bella soluzione anche quella di andbin

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Patrick Jane
    Deduco tu debba creare un gioco di carte.
    Potrei supporlo anch'io ...

    E se è effettivamente così, in tal caso sarebbe allora più appropriato "modellare" una carta con una classe (es. Carta ) che può quindi contenere più dati per ogni carta.
    Ed avendo oggetti si possono usare le collezioni, quindi un List di oggetti Carta, quindi si può usare il shuffle() di Collections.

    Originariamente inviato da Patrick Jane
    implementare la ricerca binaria
    Cosa centrerebbe il binary search con il "mescolamento"?? Non l'ho capito ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Ombra puoi fare cosi: dovrebbe funzionare

    Codice PHP:
    public class Main {


        public 
    Collection<Integer>numeri(){

            List<
    Integer>numeri = new ArrayList<Integer>();
            List<
    Integer>numeriDefinitivi = new ArrayList<Integer>();

            for(
    int i 151i++){
                
    numeri.add(i);
            }
            
            
    boolean condizione true;
            while(
    condizione){
                
    int indiceRandom = (int)(Math.random()*numeri.size());
                
                if(
    numeri.get(indiceRandom)!= null ){
                    
    numeriDefinitivi.add(numeri.get(indiceRandom));
                    
    numeri.remove(numeri.get(indiceRandom));
                }
                if(
    numeri.size() < 1){
                    
    condizione false;
                    break;
                }
            }

            return 
    numeriDefinitivi;
        }

        public static 
    void main(String[] args) {
            
    Main m = new Main();
            List<
    Integer= (List<Integer>)m.numeri();
            for(
    int i n){
                
    System.out.println("Numero: " +i);
            }
        }

    In poche parole cosa ho fatto?

    ho inserito da 0 a 51 numeri in una collection di interi, dopo di che mi sono fatto un ciclo while con una condizione vera quindi mi entra sempre li e dentro il ciclo while mi faccio tornare un numero casuale da 0 a 51. Trovato questo numero verifico se è presente nella collection che ho riempito in precedenza, se è presente lo aggiungo in una seconda collection di interi per poi eliminarla nella prima. Quando la prima collection non avrà alcun elemento, imposto la condizione del ciclo while a false

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da PerformancePort
    Codice PHP:
            boolean condizione true;
            while(
    condizione){
                
    int indiceRandom = (int)(Math.random()*numeri.size());
                
                if(
    numeri.get(indiceRandom)!= null ){
                    
    numeriDefinitivi.add(numeri.get(indiceRandom));
                    
    numeri.remove(numeri.get(indiceRandom));
                }
                if(
    numeri.size() < 1){
                    
    condizione false;
                    break;
                }
            } 
    Collections.shuffle(numeri);

    1 metodo, 1 riga.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Originariamente inviato da andbin
    Potrei supporlo anch'io ...

    E se è effettivamente così, in tal caso sarebbe allora più appropriato "modellare" una carta con una classe (es. Carta ) che può quindi contenere più dati per ogni carta.
    Ed avendo oggetti si possono usare le collezioni, quindi un List di oggetti Carta, quindi si può usare il shuffle() di Collections.

    Cosa centrerebbe il binary search con il "mescolamento"?? Non l'ho capito ....
    Mi spiego..
    Lui ha un array con i numeri da 1 a 52, al posto di riordinare quest'ultimo, può crearne un altro generando un numero random compreso in quel range, inserirlo nell'array. Con la ricerca binaria potrebbe controllare che il numero da lui generato random, non sia già presente nel nuovo array.

    Comunque il metodo migliore è decisamente quello mostrato nel tuo codice

  8. #8
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da Patrick Jane
    Mi spiego..
    Lui ha un array con i numeri da 1 a 52, al posto di riordinare quest'ultimo, può crearne un altro generando un numero random compreso in quel range, inserirlo nell'array. Con la ricerca binaria potrebbe controllare che il numero da lui generato random, non sia già presente nel nuovo array.
    Sai come funziona la ricerca binaria?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Originariamente inviato da Alex'87
    Sai come funziona la ricerca binaria?
    Certo che lo so!^^

    L'ho implementata più e più volte, senza utilizzare binarysearch.

    Si ha un elenco ordinato di numeri al quale si accede sempre alla posizione length/2 (dove la lunghezza ogni volta viene quindi "dimezzata").

    Ma pensandoci sopra ho detto una ca....., dato che quando immetterà i valori non sono ordinati :asd:

  10. #10
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    edit: letto male
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

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.