#9 Petr
Tak ak mas pevnu dlzku pola tak, si najskorej vygeneruj list s cislami (ono da sa to aj z polom ale je to menej pohodlne ;) ). list = {1,2,3,4,5,6,7,8 ... n} , teda ak je n male cislo. Toto sa hodi ak chces robit nejake permutacie. A mas n - prvkove pole a potom uz len si vygeneruje int vzdy taky aky je dlhy list. A to cislo z toho listu vytiahnes a ulozis do pola, asi takto:
public int[] Gen(int n, int min, int max){
int[] pole = new int[n];
// Generujes list ale taketo nieco sa da robit aj s polom,
// staci vytvorit dlhe pole a ak nejaku hodnotu precitas tak ju vymazes
// a zvysne poposuvas o 1, tak aby nemalo pole medzery.
List<Integer> list = new LinkedList<Integer>();
for(int i=min; i<=max; i++){
list.add(new Integer(i));
}
Random r = new Random();
// Teraz uz len generujes tak velke ako je dlzka pola
for(int i=0; i< n; i++){
int c = r.nextInt(list.size());// gen nahodne cislo o velkosti listu
pole[i] = list.get(c).intValue(); // vyberes to cislo
list.remove(c); // zmazes ho aby sa nevybralo na novo a nemusis pocuvat ako poli ;)
}
return pole; // Malo by to fungovat, ale pre velmi velke polia by to bolo pamatovo neefektivne
}
Preto tu napisem este riesenie cez 2 metody, ako mas aj ty:
public int[] gen(int n, int min, int max){
if(max - min < n){
System.out.println("pocet hodmot musi byt mensi ako pocet moznych gen. cisel");
return null;
}
int[] pole = new int[n];
Random r = new Random();
for(int i=0; i<n; i++){
int c = 0;
do{
c = r.nextInt(max-min) + min;
} while(kontrola(pole,c)) // ak taketo cislo uz exituje v tomto poli, generuje ine nahodne cislo
pole[i] = c; // Ak najdem take ktore neexistuje dopisem ho do pola
}
}
public static boolean kontrola(int[] pole, int c){
// prejdem prvky pola ak najdem rovnake cislo tak vratim true, inak false
for(int i=0; i< pole.length; i++){
if(c==pole[i])
return true;
}
return false;
}
Chybu mas v tom ze generujes prilis malo cisle, iba 9, do 10 prvkoveho pola cize aspon jedno sa ti tam urcite bude opakovat.