Creare numeri casuali in Java

Mattepuffo's logo
Creare numeri casuali in Java

Creare numeri casuali in Java

In questo articolo come genere numeri ranom usando Java.

Di per sè serve più come esercizio che per altro; o magari da inserire in qualcosa di più ampio.

La serie di numeri generati in questo caso è senza ripetizione; vuol dire che in una serire non ci possono essere due numeri uguali.

Prima vediamo l'esempio più banale, la generazione di una sola serie di numeri:


import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

public class Lista_singola {

public static void generaNumeri(int n, int max) {
Random generatore = new Random();
ArrayList<Integer> num = new ArrayList<Integer>();
num.add(generatore.nextInt(max) + 1);
int rdm;
while (num.size() < n) {
rdm = generatore.nextInt(max) + 1;
if (!num.contains(rdm)) {
num.add(rdm);
}
}
Collections.sort(num);
for (int i = 0; i < num.size(); i++) {
System.out.print(num.get(i) + " ");
}
}

public static void main(String args[]) {
generaNumeri(6, 99);
}
}

 

Il metodo generaNumeri  accetta due parametri int: n e max.

Il primo è il numero di numeri generati (scusate il gioco di parole).

Nel main io ne ho indicati 6: vuol dire che verranno generati 6 numeri.

max invece riguarda l'intervallo da cui andare a prendere numeri.

Nel codice ho messo max + 1 e nel main 99.

Vuol dire che verranno presi i numeri da 0 a 100.

L'oggetto Random serve propio per generare i numeri casuali.

L'oggetto ArrayList<Integer> consiste, in parole povere, in un array ridimnesionabile (in questo caso di integer).

Nel caso concreto ci serve perchè è in grado di controllare se è già stato inserito un numero; in sostanza evita che ci siano ripetizioni.

Ovviamente ArrayList è molto più di questo..........

Subito sotto usiamo il metodo add che serve per aggiungere elementi alla lista.

Come elementi usiamo quelli creati dall'oggeto Random con il metodo nextInt al quale passiamo il parametro max.

Istanziamo una variabile int rdm che ci servirà dopo.

Creiamo un ciclo while che dura fino a che i numeri creati sono inferiori a quelli settati nel parametro n (che settiamo nel main).

Nel while creaimo i numeri (rdm = generatore.nextInt(max) + 1;) e controlliamo se i numeri sono stati già inseriti.

Questo controllo lo facciamo col metodo contains() di ArrayList.

In pratica il numero viene inserito solo se è diverso da quelli già creati.

Con Collections.sort non facciamo altro che ordinare i numeri creati dal più piccolo al più grande.

Poi creiamo un ciclo for scandagliando tutti i numeri creati che ci permette di stamparli (in console).

Nel metodo main richiamamo il metodo passandogli i parametri.

Questa è una prima bozza; prima di passare al livello successivo accertatevi di aver ben capito.

Il secondo passaggio è quello di creare più serie di numeri:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import javax.swing.JOptionPane;

public class Lista_multipla {

public static void generaNumeri(int n, int max) {
String tavola = "";
Random generatore = new Random();
ArrayList num[] = new ArrayList[7];
for (int i = 1; i < 7; i++) {
num[i] = new ArrayList<Integer>();
num[i].add(generatore.nextInt(max) + 1);
int rdm;
while (num[i].size() < n) {
rdm = generatore.nextInt(max) + 1;
if (!num[i].contains(rdm)) {
num[i].add(rdm);
}
}
Collections.sort(num[i]);
tavola += "Lista: " + i + " " + num[i] + "\n";
}
JOptionPane.showMessageDialog(null, tavola);
}

public static void main(String args[]) {
generaNumeri(6, 99);
}
}

Potete notare subito delle differenze.

Prima di tutto il risultato verrà stampato in una JOptionPane.

Per fare questo prima di tutto creiamo una String tavola che ci servirà dopo.

La seconda differenza è che qua creiamo un array di ArrayList, in modo da gestire più serie.

Creiamo un ciclo for per generare le liste; qua scegliamo quante serie creare.

Nell'esempio sono: da 1 a 7.

Ho scelto di iniziare da uno perchè voglio stampare anche il numero della lista partendo ovviamente da 1.

Attenzione: anche in ArrayList[] bisogna mettere un numero uguale o maggiore del numero massimo del ciclo for; in questo caso da 7 in su.

Dentro al ciclo creiamo un ArrayList<Integer> per ogni ArrayList num[]c reato.

Questo da vita a warning in fase di compilazione, ma non comporta problemi.

Il resto fino a Collections.sort è uguale a prima.

Poi usiamo la String tavola per stampare il numero di lista e le varie serie di numeri.

Tavola la passiamo a un JOptionPane in modo che ci compaia una finestra di dialogo con tutte le liste.

Il metodo main è uguale a prima.

Tutto ciò è ancora migliorabile dando la possibilità di cambiare il numero di liste e il numero di numeri all'utente.

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import javax.swing.JOptionPane;

public class Lista_multipla_grafica {

public static void generaNumeri(int max) {
String tavola = "";
String liste = JOptionPane.showInputDialog("Scegli il numero di liste");
int num_liste = Integer.parseInt(liste) + 1;
String numeri = JOptionPane.showInputDialog("Scegli il tot di numeri per lista");
int n = Integer.parseInt(numeri);
Random generatore = new Random();
ArrayList num[] = new ArrayList[num_liste];
for (int i = 1; i < num_liste; i++) {
num[i] = new ArrayList<Integer>();
num[i].add(generatore.nextInt(max) + 1);
int rdm;
while (num[i].size() < n) {
rdm = generatore.nextInt(max) + 1;
if (!num[i].contains(rdm)) {
num[i].add(rdm);
}
}
Collections.sort(num[i]);
tavola += "Lista: " + i + " " + num[i] + "\n";
}
JOptionPane.showMessageDialog(null, tavola);
}

public static void main(String args[]) {
generaNumeri(99);
}
}

La prima modifica è il numero di parametri passati al metodo: adesso c'è solo max.

Prima di tutto facciamo scegliere all'utente il numero di liste attraverso un JOptionPane.showInputDialog.

Che però accetta stringhe; alla riga successiva traformiamo l'input dell'utente in un int.

Poi facciamo la stessa cosa per il numero totale per ogni lista; questo va a sostituire il parametro n.

Il resto è uguale tranne per il fatto che l'array di ArrayList e il ciclo while prendono come valori il nume di liste scelte dall'utente (num_liste).

Si potrebbe ancora migliorare usando un solo input dialog e scegliendo anche l'intervallo in cui pescare i numeri.

Se volete postatemi il risultato!


Condividi

1 Commenti

  • DAMIANO

    salve ti contatto per un consiglio ho provato il tuo codice ma non funziona mi potresti quando parte l\'app non visualizzo la stringa di numeri da poco ho iniziato a programmare, mi aiuti a capire dove ho sbagliato, se vuoi dare un occhiata alle mie app http://www.damianoloffredo.it grazie se vuoi possiamo collaborare per qualsiasi cosa puoi contattarmi magari ci scambiamo qualche frammento di codice

    19/08/2014

Commentami!