View Full Version : [java] Generare numeri non ripetuti
project_34
11-07-2006, 10:56
Random generatore = new Random();
num = generatore.nextInt(1000);
:mc: Devo generare una grande quantità di interi da mettere in un'array (utilizzo il codice riportato sopra), senza che vi siano ripetizioni..qual è il modo meno dispendioso in termini di cpu e cicli? Controllando con un for() per tutti i numeri sarebbe un suicidio..c'è qualche funzione apposta? :help:
Potresti crearti parallelamente all'array che ti interessa un array temporaneo, dove inserisci gli interi che generi ma in modo ordinato, ognuno al suo indice, poi prima di inserire l'intero nell'array vero controlli se nell'altro array prima o dopo l'intero appena inserito non ce ne sia uno uguale.
Il problema è che se te vuoi un array di 1000 interi, e vuoi che i numeri casuali vadano da 0 a 1000, quando sarai verso la fine che ti mancano pochi interi da inserire ci metterà molto a trovare quello mancante...
Comunque per quello che ho appena detto:
for(int i=0;i<size;i++){
int random=(int)(Math.random()*limite)
tempArray[random]=random;
if(tempArray[random]!=tempArray[random-1]&&tempArray[random]!=tempArray[random+1])
array[i]=random;
}
Non l'ho provato ma dovrebbe funzionare...comunque cerca di lavorare intorno ad una soluzione del genere, cercando di modificare la generazione dei numeri casuali, altrimenti avrai il problema che ti ho detto prima.
Ah, l'array temporaneo è meglio che sia un ArrayList così puoi inserire gli elementi senza specificare una dimensione di partenza.
Una possibilità potrebbe essere questa:
import java.lang.*;
import java.util.Random;
public class UniqueRandom
{
private Random rnd;
private int[] values;
private int size;
public UniqueRandom (int min, int max, long seed)
{
init (min, max);
rnd = new Random (seed);
}
public UniqueRandom (int min, int max)
{
init (min, max);
rnd = new Random ();
}
private void init (int min, int max)
{
if (min > max)
throw new IllegalArgumentException ();
size = max - min + 1;
values = new int[size];
for (int i = 0; i < size; i++)
values[i] = min + i;
}
public boolean hasValue ()
{
return size > 0;
}
public int extract ()
{
if (size == 0)
throw new IllegalStateException ();
int idx = rnd.nextInt (size);
int v = values[idx];
values[idx] = values[--size];
return v;
}
}Nota ... l'ho buttato giù velocemente (comunque funziona, l'ho provato!) ... è la prima cosa che mi è venuta in mente. :p
Non so se è quello che volevi e se ti va bene. ;)
project_34
11-07-2006, 11:59
juuuuu ho risolto grazie ad entrambi :cincin: la tua soluzione andbin è ottima per quello che mi serve :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.