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

    Creazione numeri random senza ripetizione

    devo fare questo:
    devo creare 5 serie di numeri, ogni serie composta da 6 numeri compresi tra 0 e 100.
    in ogni serie i numeri devono essere tutti diversi.
    prendendo un esempio ho cominciato con la crezione di una serie composta da 6 numeri tutti diversi:
    codice:
    package numerirandom;
    
    import java.util.TreeSet;
    
    public class Main {
    
        public static void main(String[] args) {
            TreeSet ts = new TreeSet();
            int numero;
            for (int i = 0; i < 5; i++) {
                numero = (int) Math.random() * 100;
                while (!ts.add(new Integer(numero))) {
                    numero = (int) Math.random() * 100;
                }
            }
        }
    }
    mi pare di aver capito che treeset evita che vengano inseriti valori già esistenti.
    il problema è che questo codice nn fa nulla.

  2. #2
    scusate avevo dimenticato una cosa fondamentale:
    codice:
    import java.util.TreeSet;
    
    public class Main {
    
        public static void main(String[] args) {
            TreeSet ts = new TreeSet();
            int numero;
            for (int i = 0; i < 5; i++) {
                numero = (int) Math.random() * 100;
                while (!ts.add(new Integer(numero))) {
                    numero = (int) Math.random() * 100;
                }
                System.out.println(numero);
            }
        }
    }
    in pratica mi stampa solo 0 e poi rimane in esecuzione senza fare nulla.

  3. #3
    ho risolto in questo modo:
    codice:
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Random;
    
    public class Main {
    
        private static Random generatore;
        private static ArrayList<Integer> numeriGenerati;
    
        public static void generaNumeri(int n, int max) {
            generatore = new Random();
            numeriGenerati = new ArrayList<Integer>();
            numeriGenerati.add(generatore.nextInt(max) + 1);
            int rdm;
            while (numeriGenerati.size() < n) {
                rdm = generatore.nextInt(max) + 1;
                if (!numeriGenerati.contains(rdm)) {
                    numeriGenerati.add(rdm);
                }
            }
            Collections.sort(numeriGenerati);
            for (int i = 0; i < numeriGenerati.size(); i++) {
                System.out.print(numeriGenerati.get(i) + " ");
            }
        }
    
        public static void main(String args[]) {
            generaNumeri(6, 100);
        }
    così mi genera però solo una lista.
    io avrei bisogno che me ne crei 5.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,315
    codice:
    numero = (int) Math.random() * 100;
    Questa istruzione produrrà sempre e solo il numero 0.

    Questa, invece, no:
    codice:
    numero = (int) (Math.random() * 100);
    In ogni caso, non è quello il modo corretto di ottenere un numero compreso fra 0 e 100.

    Ma questo (fra 0 incluso e 100 escluso):

    codice:
    numero = ((int) (Math.random() * 65000)) % 100;
    Oppure usando il metodo nextInt(int max) della classe Random.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    era un problema di parentesi quindi.
    soliti problemi stupidi....

    codice:
    numero = ((int) (Math.random() * 65000)) % 100;
    scusa ma perchè moltiplichi per 65000??

    cmq alla fine ho fatto in altro modo perchè anche con arrayList ho il controllo sulla duplicazione.
    solo che nn riesco ad ottenere 5 liste di numeri.
    ho fatto varie prove aggiungendo un altro ciclo for ma ottengo sempre risultati inutili.

  6. #6
    a rieccomi e poi me ne vado a pranzo.
    codice:
    public class Main {
    
        private static Random generatore;
        private static ArrayList<Integer> numeriGenerati;
    
        public static void generaNumeri(int n, int max) {
            generatore = new Random();
            numeriGenerati = new ArrayList<Integer>();
            numeriGenerati.add(generatore.nextInt(max) + 1);
            int rdm;
            while (numeriGenerati.size() < n) {
                rdm = generatore.nextInt(max) + 1;
                if (!numeriGenerati.contains(rdm)) {
                    numeriGenerati.add(rdm);
                }
            }
            Collections.sort(numeriGenerati);
            for (int j = 1; j < 6; j++) {
                for (int i = 0; i < numeriGenerati.size(); i++) {
                    System.out.print(numeriGenerati.get(i) + " ");
                }
                System.out.println("Lista numero: " + j);
            }
        }
    
        public static void main(String args[]) {
            generaNumeri(6, 99);
        }
    }
    mi crea 5 liste ma tutte uguali.
    io invece ho bisogno di 5 liste diverse.

    l'altro piccolo problema è come è messo l'output:
    40 54 57 59 61 88 Lista numero: 1
    40 54 57 59 61 88 Lista numero: 2
    40 54 57 59 61 88 Lista numero: 3
    40 54 57 59 61 88 Lista numero: 4
    40 54 57 59 61 88 Lista numero: 5
    ma diciamo che è secondario.

  7. #7
    Originariamente inviato da fermat
    era un problema di parentesi quindi.
    soliti problemi stupidi....
    Ciao fermat, non prendere alla leggera certi problemi. Ciò che tu definisci stupido a volte è fondamentale. Una parentesi a volte può fare la differenza.
    Come giustamente ti ha fatto notare LeleFT:

    codice:
    numero = (int) Math.random() * 100;
    
    numero = (int) (Math.random() * 100);
    quelle due righe di codice danno risultati assolutamente differenti e non si tratta di andare per tentativi, ma di capire esattamente la logica che c'è dietro.
    Nel primo caso il risultato di Math.random() viene castato ad int, ma essendo esso sempre compreso tra 0 e 1 tale cast comporterà sempre un arrotondamento per difetto e quindi a 0 tranne quando esso varrà 1.
    Nel secondo caso invece è il risultato dell'operazione Math.random() * 100 che verrà castato ad int.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,315
    Originariamente inviato da satifal
    Nel primo caso il risultato di Math.random() viene castato ad int, ma essendo esso sempre compreso tra 0 e 1 tale cast comporterà sempre un arrotondamento per difetto e quindi a 0 tranne quando esso varrà 1.
    Cioè mai, dato che Math.random() restituisce un valore compreso fra 0 (incluso) e 1 (escluso).

    scusa ma perchè moltiplichi per 65000??
    Solo per avere un valore ragionevolmente grande e disperso che mi consenta di avere un valore in modulo 100 ragionevolmente casuale... Si potrebbe usare tranquillamente un valore diverso. In realtà esistono valori più adatti, ma per lo scopo della mia dimostrazione era sufficiente quel valore.

    Dato che la funzione Math.random() restituisce un valore double compreso fra 0 (incluso) e 1 (escluso), moltiplicando per un valore ragionevolmente grande si ottiene da un lato un valore compreso fra 0 e il valore per cui si moltiplica (meno un epsilon), e dall'altro una dispersione maggiore dei valori. Esempio banale: si supponga che due invocazioni di Math.random() restituiscano i seguenti valori:

    0.46xxx
    0.49yyy

    Supponiamo di volere dei numeri casuali compresi fra 0 e 9.
    Scegliendo come moltiplicatore 10 otteniamo:

    (0.46xxx * 10) = 4.6xxx
    (0.49yyy * 10) = 4.9yyy

    Castando ad int ed effettuando il modulo, otteniamo 4 in entrambi i casi:

    Se scegliamo, invece, come moltiplicatore 100, otteniamo

    (0.46xxx * 100) = 46.xxx
    (0.49yyy * 100) = 49.yyy

    Che castati ad intero danno 46 e 49. Effettuando il modulo otteniamo, rispettivamente, 6 e 9.

    Con gli stessi valori della funzione Math.random() abbiamo ottenuto risultati "più dispersi"
    scegliendo un numero ragionevolmente grande.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Originariamente inviato da LeleFT
    Cioè mai, dato che Math.random() restituisce un valore compreso fra 0 (incluso) e 1 (escluso).

    ...
    Opppssss, ho controllato le API, hai perfettamente ragione!
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  10. #10
    si però il mio problema è diventato un altro.
    io numeri casuali li creo, e creo 5 liste.
    il problema è che queste 5 liste sono uguali ed io invece sto cercando di ottenere 5 liste diverse.
    è li che mi sto inceppando.

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.