Zwei-dimensionales Array mit Zufallszahlen füllen - Keine doppelten Zahlen!



  • Gute Nacht an alle Nachtschwärmer 😉
    Ich möchte einen zwei-dimisionalen Array mit Zufallszahlen füllen.
    Soweit schaffe ich das auch ganz gut alleine.
    Nun möchte ich allerdings, das keine Zahl doppelt im Array steht. Wenn doch, soll eine neue Zufallszahl gesucht werden!

    Zum Beschreiben des Arrays habe ich folgenden Script geschrieben:

    #include <stdio.h>
    #include <windows.h>
    #include <time.h>
    #define MAX 5
    
    void main()
    {
    	int feld[MAX][MAX]={0};
    	int k,i,j;
    
    	srand(time(0));
    
    		k=1;
    		for(i=0;i<MAX;i++)
    		{
    			for(j=0;j<MAX;j++)
    			{
    				feld[i][j]=rand() % 25 + 0;
    
    				printf("Nr.%2i:\t%2i\n",k,feld[i][j]);
    
    				k++;
    			}
    		}
    }
    

    Das Array besteht aus 5*5 Felder, das mit den Zahlen von 0 bis 25 beschrieben werden soll - allerdings zufällig und nicht in korrekter Reihenfolge 😃
    Wie funktioniert nun eine "Kontrolle", so dass keine zahl doppelt existiert?
    Muss ich jeden Wert mit jeden vergleichen oder wie?
    Brauche ich dafür weitere Schleifen oder gibt es fertige Befehle in C ?

    Wie ihr nun sicherlich merkt, bin ich momentan ziemlich ratlos ... 😕
    Vielleicht könntet ihr meinen "Keine-Doppelten-Zahlen-Im-Array"-Skill mit Hilfe eines guten Kommentares verbessern 😉



  • Du musst der Funktion srand schon den richtigen Parameter übergeben... time sollte auf den Nullpointer zeigen, damit immer wieder eine Zufallszahl generiert wird.

    Die Kontrolle, dass keine doppelte Zahl vorkommt, kannste mit einer Methode realisieren, die überprüft ob eine Zahl in einem Array doppelt vorkommt oder nicht. 😉 Empfehlen würde ich dir hier eine int-Methode, je nachdem ob doppelt oder nicht.. 😉 Das Implementieren ist aber dir überlassen natürlich, denn so einfach geht es dann doch nicht. :p



  • Entweder du schaust bei jeder zufallszahl, ob sie schon in irgend einem arrayfeld eingetragen ist, das kann bei großen array aber lang brauchen, weil du immer wieder alles durchschauen musst, falls eine Zufallszahl schon da war.

    Oder du machst dir noch ein Array und füllst es mit den Zahlen 0-25. Dann nimmst du einen Zufälligen Index (0-25) und kopierst den wert von dort in das 5x5 Array. Den Wert überschreibst du dann mit dem lezten aus dem Array und nimmst beim nächsten mal nur einen Zufallswert von 0-24 für den Index.
    Beispiel für 1x5 Array

    Array: 0 1 2 3 4
    Ar1x5: 
    Zufallszahl(0-4): 2
    
    Array: 0 1 4 3 -
    Ar1x5: 2
    Zufallszahl(0-3): 1
    
    Array: 0 3 4 - -
    Ar1x5: 2 1
    Zufallszahl(0-2): 2
    
    Array: 0 3 - - -
    Ar1x5: 2 1 4
    Zufallszahl(0-1): 1
    ...
    Ar1x5: 2 1 4 3 0
    


  • helfer.. schrieb:

    Du musst der Funktion srand schon den richtigen Parameter übergeben... time sollte auf den Nullpointer zeigen, damit immer wieder eine Zufallszahl generiert wird.

    Wie jetzt??
    Mache ich das nicht?
    Wie hätte man es denn richtig machen sollen? 😕

    helfer.. schrieb:

    Die Kontrolle, dass keine doppelte Zahl vorkommt, kannste mit einer Methode realisieren, die überprüft ob eine Zahl in einem Array doppelt vorkommt oder nicht. 😉

    Ich glaube soweit war ich auch schon..
    Geh doch mal mehr aufs Thema ein und reiß nicht nur die "Überschrift" an.
    Mach doch auch mal einen Vorschlag mittels eines Scriptes - So das auch Newbies wie ich sowas verstehen können 😉

    naja schrieb:

    Oder du machst dir noch ein Array und füllst es mit den Zahlen 0-25. Dann nimmst du einen Zufälligen Index (0-25) und kopierst den wert von dort in das 5x5 Array. Den Wert überschreibst du dann mit dem lezten aus dem Array und nimmst beim nächsten mal nur einen Zufallswert von 0-24 für den Index.

    jesses maria, das ging mir jetzt aber ein wenig zu schnell 😃
    Dein Beispiel habe ich zwar mittlerweile verstanden, allerdings habe ich überhaupt keine Ahnung wie ich sowas funktionsfähig umsetze 😞



  • Dein Beispiel habe ich zwar mittlerweile verstanden, allerdings habe ich überhaupt keine Ahnung wie ich sowas funktionsfähig umsetze

    So z.B., musst es nur noch in C umsetzen.

    1. array mit Werten füllen (0-25)
    2. max = 25
    3. r = rand() % max
    4. feld[i][j] = array[r]
    5. array[r] = array[max]
    6. max--;
    7. i oder j erhöhen
    8. wenn nicht i und j am ende, gehe zu 3.





  • OK, nun geb ich auf.
    Ich bin zwar mittlerweile so weit, dass immer nur die erste Zahl aus dem Array doppelt angezeigt wird, aber weiter komme ich auch schon nicht.
    Die if() Abfrage "wenn nicht i und j am ende, gehe zu 3." bekomme ich ebenfalls nicht realisiert.

    Momentaner \1:

    #include <stdio.h>
    #include <windows.h>
    #include <time.h>
    #define MAX 5
    
    void main()
    {
    	int feld[MAX][MAX]={0};
    	int array[(MAX*MAX)]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24};
    	int k,i,j,maxi,r;
    
    	srand(time(NULL));
    
    	k=1;
    	maxi=25;
    
    	for(i=0;i<MAX;i++)
    	{
    		for(j=0;j<MAX;j++)
    		{
    			r= rand() % maxi;
    			feld[i][j]=array[r];
    			array[r]=array[maxi];
    			maxi--;
    
    			printf("%3i | feld[%i][%i]:\t%2i\n",k,i,j,feld[i][j]);
    
    			k++;
    		}
    	}
    }
    

    Vielleicht kann mir einer das Script noch so verbessern, das er auch wirklich funktioniert? 😞



  • Wenn du das array nur von 0-24 füllst, dann darf maxi auch nur 24 sein. Sonst greifst du hinter das array (und da steht irgendwas), weil array[25] = 26. Element.

    Die if() Abfrage "wenn nicht i und j am ende, gehe zu 3." bekomme ich ebenfalls nicht realisiert.

    Das passt auch so wie du es hast. soll nur ne schleife sein, ob for, do-while oder while ist eigentlich egal.



  • Daran hatte ich auch schon gedacht.
    Tut man allerding

    maxi=24
    

    kommt eine Windows Fehlermeldung!
    Was nun?



  • Zuerst der Reihe nach die Zahlen schreiben, dann mischen. Wie siehe hier:

    DerEntenwickler schrieb:

    http://www.stanford.edu/~blp/writings/clc/shuffle.html



  • Agip schrieb:

    kommt eine Windows Fehlermeldung!
    Was nun?

    Stimmt, dann wäre es ja Division durch 0. Musst halt vor r= rand() % maxi noch maxi != 0 prüfen, sonst r = 0.



  • naja schrieb:

    Stimmt, dann wäre es ja Division durch 0. Musst halt vor r= rand() % maxi noch maxi != 0 prüfen, sonst r = 0.

    Da ist was dran 😃
    Funktioniert nun wunderbar!
    Vielen Dank an alle Helfer 😉


Anmelden zum Antworten