# Keine doppelten Zufallszahlen im Array



## Kia (1. Feb 2014)

Hallo, ich habe hier ein Problem, ich möchte nämlich im einem Array Zufallszahlen erzeugen, ohne dabei break zu verwenden, mein bisheriger Code: 
	
	
	
	





```
import java.util.Scanner;
import java.util.Random;
public class Lernen {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	Random rand=new Random();
	Scanner scan=new Scanner(System.in);
	int ug,og;
	int arrL=0;
	int menue=0;
	int t=0;
	
	System.out.println("Wie lang soll ihr Array sein? Bitte geben sie die Länge ein");
	arrL=scan.nextInt();
	 int []  arr=new int[arrL];
	
	System.out.println("Bitte geben Sie die Untergrenze der Zahlen ein!");
	ug=scan.nextInt();
	
	System.out.println("Bitte geben Sie die Obergrenze der Zahlen ein!");
	og=scan.nextInt();
	
	for(int i=0;i<arrL;i++)
	{
		arr[i]=0;
		
	}
	
	while(menue==0)
	{
		System.out.println("Sortieren der Liste Tippe 1");
		System.out.println("Zufallszahlen Füllen Tippe 2");
		System.out.println("Liste ausgeben Tippe 3");
	
		menue=scan.nextInt();

	if(menue==1)
		{
			boolean y=false;
		      int temp;
		      do{
		       y=false;
		         for (int i=0; i <arrL-1; i++) 
		            if (arr[i] >= arr[i+1]) {                      
		               temp       = arr[i];
		               arr[i]       =arr[i+1];
		               arr[i+1]     = temp;
		               y=true;
		            }
		      }while(y);
		      
		      System.out.println("Möchten sie wieder zurück zum Menü? Drücken sie bitte die 0!");
					menue=scan.nextInt();;
					System.out.println("");
		}





		if(menue==2)
		{
		
				for(int i=0;i<arrL;i++)
				{
					arr[i]=rand.nextInt(og-ug)+ug;
				
				}
				for(int s=0;s<arrL;s++)
				{
					t=arr[s];
					for(int k=s;k<arrL-1;k++){
						if(t==arr[k+1])
						{
						arr[k]=rand.nextInt(og-ug)+ug;
						}	
					}
					
		
		}
				
		System.out.println("Möchten sie wieder zurück zum Menü? Drücken sie bitte die 0!");
					menue=scan.nextInt();;
					System.out.println("");
		}
			
			if(menue==3)
			{
				for(int n=0;n<arrL;n++)
				{
					System.out.println("Array "+n+" Array= "+arr[n]);
				}
				
		System.out.println("Möchten sie wieder zurück zum Menü? Drücken sie bitte die 0!");
					menue=scan.nextInt();;
					System.out.println("");
			}
		
	}
	
	
		
	}
	
}
```


----------



## lenuyx (1. Feb 2014)

vielleicht kannst du es so machen das du dir ein Array mit der Menge an zufallszahlen generierst.
bsp.: a[10] gefüllt mit 0-9.
dann nimmst du ein 2. Array das die zufallszahlen enthalten soll. nun wählst du mit Math.random() das Feld des 1. Arrays aus und überträgst die zahl in das 2. Array. nun noch im 1. Array eine Flag setzten z.b. -1 um nicht nocheinmal dieses Feld zu nehmen.

sry vll bischen zu umständlich erklärt hoffe du verstehst was ich meine.


----------



## Kia (1. Feb 2014)

ne sry ich verstehs nicht, aber ich erklär ma kurz wie ich es ungefähr sein sollte, also er soll im arry überprüfen ob eine zahl doppelt vorkommt, und dann im gesamten array die zufallszahlen so oft generieren bis keine mehr doppelt vorkommt.

ich mache das, weil ich nächste woche freitag eine Hü bzw test  über dieses thema und der rekursion schreibe/programmiere


----------



## lenuyx (1. Feb 2014)

verstehe ich dich richtig?

ziel: ein Array gefüllt mit zufallszahlen ohne doppelte
vorgegebene schritte: Array mit zufallszahlen füllen dann doppelte heraussuchen und wieder mit zufallszahl ersetzten bis alle zahl einzigartig sind

meine Idee:

ziel: gleich.

schritte:
1. ein Array A erschaffen in denen die Menge der Zufallszahlen stehen. z.b. 0-100 (101 großes Array)
2. ein Ziel Array Z erschaffen.
3. per Zufall ein Feld aus A auswählen (falls die zahl -1 ist 3. wiederholen) diese Zahl temp. speichern und eine Flag eintragen z.b. -1
4. die temp. Zahl ins Array Z einfügen.
5. wiederholen von 3-5 bis das Array Z voll ist


----------



## DrZoidberg (1. Feb 2014)

Mir fallen da zwei Möglichkeiten ein.
Die einfachste ist ein HashSet zu verwenden.
Die zweite Methode besteht darin ein Array mit den Zahlen von ug bis og zu füllen. Danach mischt du das Array und erstellst ein neues Array mit den arrL ersten Elementen.


```
private static Random rand = new Random();

public static int[] randArray1(int arrL, int ug, int og) {
    HashSet<Integer> set = new HashSet<>();
    while(set.size() < arrL) set.add(rand.nextInt(og-ug)+ug);
    Integer[] arr1 = set.toArray(new Integer[arrL]);
    int[] arr2 = new int[arrL];
    for(int i = 0; i < arrL; i++) arr2[i] = arr1[i];
    return arr2;
}

public static void shuffle(int[] arr) {
    for(int i = arr.length-1; i > 0; i--) {
        int j = rand.nextInt(i+1);
        int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;
        
    }
}

public static int[] randArray2(int arrL, int ug, int og) {
    int l = og-ug;
    int[] arr = new int[l];
    for(int i = 0; i < l; i++) arr[i] = ug+i;
    shuffle(arr);
    return Arrays.copyOf(arr, arrL);
}
```

Wenn og-ug relativ klein ist, ist randArray2 die effizienteste Methode. Andernfalls ist randArray1 besser.


----------



## Kia (1. Feb 2014)

nach möglich keit sollte nur ein Array da sein.
ich versteh glaube jezt was du meinst also aus dem array A zufällig zahlen raussuchen und einfügen in array Z, aber das ist nicht das was ich will bzw. ich will mir der Random klasse Arrays erzeugen, ohne die zahlen einzelnd einzugeben müssen z.B. (1,2,,3,4...-100) das soll nicht der fall sein.
die zahlen sollten ca. so generiert werden 
	
	
	
	





```
for(int i=0;i<arrL;i++)
				{
					arr[i]=rand.nextInt(og-ug)+ug;
				
				}
```
 und dann soll von array der variabel der arrL(die länge des array) von 0-arrL geprüft werden ob zahlen doppelt vorkommen, wenn ja generiert er das ganze array von 0-arrL nochmal mit zufallszahlen der grenzen durch. danach überprüft er nochmal, ob eine zahl doppelt vorkommt.

hoffe, ich konnte dir ungefähr schildern wie ich es haben will.



Aber danke für deine lösungsansätze


----------



## Kia (1. Feb 2014)

aber ehrlichgesagt verstehe ich die lösungen in der sufu nicht ...


----------



## rme (1. Feb 2014)

Der übliche Ansatz für sowas ist so ähnlich wie der von lenuyx:

Man erzeugt sich die Zahlen von der Untergrenze bis zur Obergrenze im Array und nimmt dann eine Schleife, die in jeder Iterationen zwei zufällige Array-Positionen bestimmt und diese Elemente vertauscht. Das ganze og - ug mal oder so.


----------



## Kia (1. Feb 2014)

```
if(menue==2)
		{		int [] k=new int[(og)];
			 for(int w=0;w<og;w++)
			 {
				 k[w]=w+ug;
			 }
			   int r=0,ras;
				for(int b=0;b<arrL;b++)
				{	ras=rand.nextInt(og-ug);
					r=k[ras];
					if(r<=og&&r>=ug){
					arr[b]=k[ras];
					}
					k[ras]=k[ras]-1;
				}
			 
		System.out.println("Möchten sie wieder zurück zum Menü? Drücken sie bitte die 0!");
				menue=scan.nextInt();;
				System.out.println("");
			
			
		}
```

etwa so? leider kommen auch hierbei doppelte zahlen vor


----------



## rme (1. Feb 2014)

Hm.. Die Umsetzung passt nicht so ganz zur Beschreibung  Beim Füllen des Arrays gehst du von 0 bis og, aber wenn ug nicht 0 ist, passt das nicht - überleg dir nochmal, wie viele Zahlen tatsächlich vorhanden sind.

Der zweite Fehler ist in der 2. Schleife: Du bestimmst eine zufällige Position und holst das Element aus dem Array k. Aber das zweite Element, mit dem du tauschen willst, holst du nicht aus einer anderen Position, sondern du nimmst die gleiche Stelle (ras) und ziehst vom Element eins ab. Richtiger wäre es, vom Index 1 abzuziehen - aber auch das passt noch nicht zur Idee, denn dann vertauscht du nur benachbarte Elemente. Die Idee war es, _zwei_ zufällige Positionen zu bestimmen und dann die Elemente an diesen Plätzen zu tauschen.

Du bist aber jetzt kurz vorm Ziel


----------



## Kia (1. Feb 2014)

rme hat gesagt.:


> Hm.. Die Umsetzung passt nicht so ganz zur Beschreibung  Beim Füllen des Arrays gehst du von 0 bis og, aber wenn ug nicht 0 ist, passt das nicht - überleg dir nochmal, wie viele Zahlen tatsächlich vorhanden sind.
> 
> Der zweite Fehler ist in der 2. Schleife: Du bestimmst eine zufällige Position und holst das Element aus dem Array k. Aber das zweite Element, mit dem du tauschen willst, holst du nicht aus einer anderen Position, sondern du nimmst die gleiche Stelle (ras) und ziehst vom Element eins ab. Richtiger wäre es, vom Index 1 abzuziehen - aber auch das passt noch nicht zur Idee, denn dann vertauscht du nur benachbarte Elemente. Die Idee war es, _zwei_ zufällige Positionen zu bestimmen und dann die Elemente an diesen Plätzen zu tauschen.
> 
> Du bist aber jetzt kurz vorm Ziel



wie lösche ich denn die durch ras ausgesuchte zahl im den array k?


----------



## rme (1. Feb 2014)

- aus der ersten Position in eine Variable kopieren (machst du schon)
- von der zweiten Position an die erste kopieren (dadurch wird der erste Werte überschrieben)
- von der Variable in die zweite Position schreiben (dadurch wird der zweite Wert überschrieben)


----------



## Kia (1. Feb 2014)

rme hat gesagt.:


> - aus der ersten Position in eine Variable kopieren (machst du schon)
> - von der zweiten Position an die erste kopieren (dadurch wird der erste Werte überschrieben)
> - von der Variable in die zweite Position schreiben (dadurch wird der zweite Wert überschrieben)



etwa so? 
	
	
	
	





```
if(menue==2)
		{		   int [] k=new int[(og)];
			for(int w=0;w<og;w++)
			{
				k[w]=w+ug;
				if(w<arrL)
				{
				arr[w]=rand.nextInt(og-ug)+ug;
				}
			}
			int r=0,ras;
				for(int b=arrL;arrL-b!=0;b--)
				{   ras=rand.nextInt(k.length+b);
					r=arr[b];
					if(r<=og&&r>=ug){
							r     = arr[b];
			               arr[b]       =arr[b+1];
			               arr[b+1]     = r;
			              
					}
				
				}
        
           System.out.println("Möchten sie wieder zurück zum Menü? Drücken sie bitte die 0!");
           menue=scan.nextInt();;
           System.out.println("");
				
		}
```

also das klappt leider auch nicht, kannst du mir das bitte als code darstellen vielleicht verstehe ich das dann.


----------



## rme (1. Feb 2014)

Hier mal ein Beispiel 


```
import java.util.Arrays;
import java.util.concurrent.ThreadLocalRandom;

public class Mix {
    public static void main(String[] args) {
        int ug = 3;
        int og = 20;
        int arrL = og - ug;

        int[] arr = new int[arrL];

        // initial mit allen vorhandenen Werten füllen
        for(int i = 0; i < arrL; i++) {
            arr[i] = ug + i;
        }

        // jetzt ein paarmal tauschen
        for(int i = 0; i < arrL; i++) {
            // zwei Positionen bestimmen
            int j = ThreadLocalRandom.current().nextInt(arrL);
            int k = ThreadLocalRandom.current().nextInt(arrL);

            // und diese tauschen
            int temp = arr[j];
            arr[j] = arr[k];
            arr[k] = temp;
        }

        System.out.println(Arrays.toString(arr));
    }
}
```


----------



## Kia (1. Feb 2014)

glaube ich habs hinbekommen xD nachdem mir das eben beim pinkeln eingefallen ist :lol:


```
import java.util.Scanner;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
public class Lernen {

	private static int[] arrayMix (int[] k) {
        int tmp;
        int rand;
       
        Random r = new Random();
       
	
        for (int i = 0; i < k.length; i++) {
            rand = r.nextInt(k.length);
            tmp = k[i];
            k[i] = k[rand];
            k[rand] = tmp;
        }
        return k;
    } 
	/**
	 * @param args
	 * 
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	Random rand=new Random();
	Scanner scan=new Scanner(System.in);
	int ug,og;
	int arrL=0;
	int menue=0;
	int t=0;
	int kl=0;
	
	
	System.out.println("Wie lang soll ihr Array sein? Bitte geben sie die Länge ein");
	arrL=scan.nextInt();
	 int []  arr=new int[arrL];
	
	System.out.println("Bitte geben Sie die Untergrenze der Zahlen ein!");
	ug=scan.nextInt();
	
	System.out.println("Bitte geben Sie die Obergrenze der Zahlen ein!");
	og=scan.nextInt();
	 int [] k=new int[(og)];
	
	
	while(menue==0)
	{
		System.out.println("Sortieren der Liste Tippe 1");
		System.out.println("Zufallszahlen Füllen Tippe 2");
		System.out.println("Liste ausgeben Tippe 3");
	
		menue=scan.nextInt();

		
		
		if(menue==1)
		{
			boolean y=false;
		      int temp;
		      do{
		       y=false;
		         for (int i=0; i <arrL-1; i++) 
		            if (arr[i] >= arr[i+1]) {                      
		               temp       = arr[i];
		               arr[i]       =arr[i+1];
		               arr[i+1]     = temp;
		               y=true;
		            }
		      }while(y);
		      
		       System.out.println("Möchten sie wieder zurück zum Menü? Drücken sie bitte die 0!");
					menue=scan.nextInt();;
					System.out.println("");
		}
		
		
		
		if(menue==2)
		{		 
			 /* int r=0,ras;
			  for(int i = 0; i < arrL; i++) {
		            // zwei Positionen bestimmen
		            int j = ThreadLocalRandom.current().nextInt(arrL);
		            int m = ThreadLocalRandom.current().nextInt(arrL);
		 
		            // und diese tauschen
		            int temp = arr[j];
		            arr[j] = k[m];
		            k[m] = temp;
		            
		            }*/
			
			for(int w=0;w<og;w++)
			{
				k[w]=w+ug;
				
			}
			
				k=arrayMix(k);
		        
			for(int r=0;r<arrL;r++)
			{
				arr[r]=k[r];
			}
				
				
        
           System.out.println("Möchten sie wieder zurück zum Menü? Drücken sie bitte die 0!");
           menue=scan.nextInt();;
           System.out.println("");
			
			
		}
			
			if(menue==3)
			{
				for(int n=0;n<arrL;n++)
				{
					System.out.println("Array "+n+" Array= "+arr[n]);
				}
				
		System.out.println("Möchten sie wieder zurück zum Menü? Drücken sie bitte die 0!");
					menue=scan.nextInt();;
					System.out.println("");
			}
				
	
	}
	
	
		
	}

}
```


----------



## Kia (2. Feb 2014)

bubblesorte gerade eine liste mit 10mille einträge .. nach 20 min wurde die immer noch nicht sortiert meint ihr er steckt in einer endlosschleife oder das ist normal?


----------



## rme (2. Feb 2014)

BubbleSort hat eine quadratische Laufzeit, d.h. für 10 Millionen Einträge werden schon 100.000.000.000.000 Vergleiche benötigt  Du wirst eine kleinere Folge sortieren müssen oder ein schnelleres Sortierverfahren nehmen müssen.


----------



## lenuyx (2. Feb 2014)

Bubblesort hat O(n²), wenn es eine liste mit Objekten ist...

lass ihn doch mal drucken ^^

EDIT: rme ist einfach zu schnell ^^


----------

