C# Zufallszahlengenerator Problem

p0lat

Neuling
Thread Starter
Mitglied seit
30.11.2010
Beiträge
132
Hey,
ich will eine Zufallsgenerator erstellen aber irgendwie klappt es nicht, es hakt immer irgendwo.

Mein Code sieht folgendermaßen aus:
Code:
Random Zufall = new Random();
int[] zufallszahl = new int[15];
            for (int i5 = 0; i5 < 15; i5++)
            {
                while (Array.BinarySearch(zufallszahl,zufallszahl[i5]) > 0) {
                    zufallszahl[i5] = Zufall.Next(0, 14);
                }
                zufallszahl[i5] = Zufall.Next(0, 14);
            }

Soweit sogut. Wenn ich es ausgebe, gibt es dennoch Zahlen die doppelt vorhanden sind also z.B 2x die 0. Ich will aber, dass dies eben durch diese Funktion nicht geschieht.
Es sollen beispielsweise 15 Elemente erstellt werden und in der for Schleife für jedes Element eine andere Zufallszahl, sodass 0-14 belegt ist, aber eben in zufälliger Reihenfolge.

Für bessere Vorschläge bin ich offen.

Vielen Dank


Edit: Mir fällt da grad ein, nach der while Schleife wird nochmal eine Zufallszahl generiert. Das ist natürlich falsch. Aber auch wenn ich es wegmache oder es über die While schleife tue, ändert sich nichts.
Jetzt wird seltsamerweise garnichts mehr ausgegeben, die Zufallszahlen werden nichtmal generiert.
Davor ging es mit einer Verzweigung, mit der while Schleife wohl garnicht mehr
 
Zuletzt bearbeitet:
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Verstehe ich es richtig, dass Du die Zahlen 0 - 14 in einer beliebigen Reihenfolge willst?

*e* Hier kam noch mehr, aber das war auch Quatsch.
 
Zuletzt bearbeitet:
Genau, ich will einfach ein Array erstellen mit 15 Elementen, die jeweils eine zufällige Nummer zwischen 0-14 bekommen.

Bei deinem Code gibt es allerdings auch das Problem, dass dann z.b Element 0 den Wert 8 bekommt.
Dann bringt es ja auch nichts.

Dennoch vielen Dank.
 
Die Voraussetzung für die binäre Suche ist ein sortiertes Feld. Ist dein Feld nicht sortiert, kannst du dich nicht auf das Ergebnis der Suche verlassen. Sortier also dein Array, nachdem du eine Zahl gesetzt hast. Jedoch klappt dann der Code mit dem hinzufügen nicht so toll, weil du ja an feste Positionen schreibst. Wechsel daher von einem Array zu einer Liste und das Problem ist auch gelöst.
 
http://msdn.microsoft.com/de-de/library/2dx6wyd4.aspx schrieb:
Random.Next-Methode (Int32, Int32)
minValue
Typ: System.Int32
Die inklusive untere Grenze der zurückgegebenen Zufallszahl.

maxValue
Typ: System.Int32
Die exklusive obere Grenze der zurückgegebenen Zufallszahl. maxValue muss größer oder gleich minValue sein.
Klartext: mit Zufall.Next(0, 14); bekommst du nur Zahlen von 0-13.
Deine for-Schleife läuft aber von 0-14, am ende sind also schon alle Zahlen bis auf die letzte Befüllt, nur die 14 kommt noch nicht vor, da sie von Zufall.Next(0, 14) garnicht generiert wird.
Es wird immer wieder eine Zahl von 0-13 generiert, die aber in dem Array alle schon vorkommen. Daraus resultiert dann eine Endlosschleife.

Anstatt Binary Search einfach Array.Contains() verwenden, da dein Array unsortiert ist.

So funktioniert es:
Code:
            Random Zufall = new Random();
            // Liefert die Zahlen 0-17 zufällig verteilt
            int zMin = 0;
            int zMax = 17 + 1;
            int zSize = zMax;
            int[] zufallszahl = new int[zSize];
            for (int i = 0; i < zSize; i++)
            {
                zufallszahl[i] = -1;
            }

            for (int i5 = 0; i5 < zSize; i5++)
            {
                int neueZufallsZahl = Zufall.Next(zMin, zMax);
                while (zufallszahl.Contains(neueZufallsZahl))
                {
                    neueZufallsZahl = Zufall.Next(zMin, zMax);
                }
                zufallszahl[i5] = neueZufallsZahl;
                Console.WriteLine(i5.ToString() + " hat den Zufallswert " + zufallszahl[i5].ToString());
            }
            Console.WriteLine("Ende");
            Console.ReadLine();
 
Zuletzt bearbeitet:
Vielen Dank Leute!

@pointX

Dein Code funktioniert super.
Die Contains Funktion habe ich die ganze Zeit gesucht aber lustigerweise wohl übersehen :)
 
Eine Runde Thread Necromancy, wenn ich dich richtig verstehe willst du ein Zahlenarray befüllen aus einem Bereich und keine Zahl doppelt haben. Die Idee die du dafür brauchst, ist dass du ein Zahlenarray verwürfelst, also zufällig Werte mit anderen Werten vertauschst. Das ganze ist dann bekannt unter Knuth Shuffle oder Fisher-Yates Shuffle.

Sieht dann so aus, siehe Wikipedia artikel:
Code:
            int[] input = new int[15];
            for (int i = 0; i < input.Length; i++)
            {
                input[i] = i;
            }

            // http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
            Random prng = new Random();
            for (int i = input.Length - 1; i > 0; i--)
            {
                var j = prng.Next(i);
                var temp = input[j];
                input[j] = input[i];
                input[i] = temp;
            }

            Console.WriteLine(string.Join(", ", input));
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh