Ich bin in C # mit der Programmierung eines Arrays beschäftigt. Ich kann es mit Zufallsgeneratoren füllen, aber jetzt ist meine Frage, wie mache ich das, aber damit ich überprüfen kann, ob der Wert bereits im Array ist und wenn ja, erzeuge einen neuen Wert
Zusätzliche Informationen:
Maximalwert: 100
Anzahl der Elemente: 100
WICHTIG PLZ ARBEITEN WEITER AUF MEINER IDEE
meine Idee
%Vor%Implementierung der Auswahlsortierung
%Vor%Dies sind nur einige Ideen, die ich jetzt wissen möchte, wie ich es beheben kann, damit ich mit der Auswahl sortieren kann, wenn dort alles gelesen wird (fillarray), das ist dasselbe, wenn es durch einen neuen zufälligen Wert ersetzt wird. Und so möchte ich ein zufälliges Array mit Ints erstellen - von 1 bis 100 in zufälliger Reihenfolge
wie mache ich das, aber damit ich überprüfen kann, ob der Wert bereits im Array ist und wenn ja, erzeuge einen neuen Wert
Das machst du nie, weil das eine sehr schlechte Idee ist .
Um zu veranschaulichen, warum es eine schreckliche Idee ist, betrachten Sie eine andere Version des gleichen Problems: Sortieren Sie eine Million Zahlen nach dem folgenden Verfahren in eine zufällige Reihenfolge:
Das funktioniert eindeutig. Ist es eine gute Idee? Nehmen wir an, Sie sind fast fertig. Die Liste enthält 999999 Elemente. Der einzige fehlende Artikel ist 857313. Was machst du? Sie wählen eine zufällige Zahl, sagen wir 12. Nun überprüfen Sie die 999999 Elemente in der Liste, um zu sehen, ob einige von ihnen 12 sind. 12 könnte eine der ersten Zahlen sein, die Sie gewählt haben, so dass es schnell gefunden werden kann. Oder es könnte einer der letzten sein, also wird es lange dauern. Im Durchschnitt werden 500000 Überprüfungen benötigt, um zu sehen, ob 12 auf der Liste steht. Und es ist, da nur eine Nummer in der Liste fehlt.
12 hat nicht funktioniert. Gehe zurück zum Anfang. Wähle eine andere Zufallszahl, sagen wir 53259. Ist das auf der Liste? Eine weitere halbe Million Schecks.
Mach so weiter, bis du 857313 generierst, was bei jeder Million Versuchen passiert.
Um also das letzte Element in die Liste aufzunehmen, braucht man 500000 x 1000000 = 500 Milliarden Vergleiche. Es könnte viel mehr brauchen. Es könnte mehrere Billionen Vergleiche dauern. Oder du könntest Glück haben und es braucht einen. Aber im Durchschnitt eine halbe Billion Vergleiche.
Dies ist ein schrecklicher Weg, um eine zufällige Reihenfolge einer Liste zu erzeugen.
Es gibt zwei gute Möglichkeiten, um eine zufällige Reihenfolge einer Liste zu machen.
(1) Erstellen Sie ein Gerät, das eine Liste mit einer Sortierfunktion sortieren kann. Stellen Sie eine stabile Reihenfolge bereit, die auf einem zufälligen Seed basiert.
Beachten Sie, dass Sie nicht eine zufällige Reihenfolge erstellen sollten, indem Sie eine Methode erstellen, die zufällige Ergebnisse zurückgibt, wenn Sie gefragt werden "ist A größer als B?" Das ist eine instabile Ordnung; Viele Sortieralgorithmen basieren auf einer stabilen Sortierreihenfolge und gehen in unendliche Schleifen über oder haben ein anderes schlechtes Verhalten, wenn sie eine instabile Sortierordnung erhalten.
Dieser Algorithmus ist O (n lg n) und hat die nette Eigenschaft, dass es sehr einfach ist, aus Standardteilen zu schreiben, wie andere Antworten anzeigen. Es ist auch extrem schnell für kleine Listen in typischen Implementierungen.
(2) Wählen Sie ein Element per Index aus einer Quellenliste nach dem Zufallsprinzip, entfernen es aus der Quellenliste, während Sie gehen, und setzen Sie es auf die Zielliste.
Letzteres wird als Knuth Shuffle oder Fischer-Yates Shuffle bezeichnet und ist ein sehr schneller Algorithmus. Sie können dies "an Ort und Stelle" tun, indem Sie ein vorhandenes Array in eine gemischte Reihenfolge ändern oder indem Sie eine neue Liste erstellen. Es hat auch die nette Eigenschaft, dass Sie "für das Spiel bezahlen können", das "Oberteil" der Liste mischend, wie Sie es brauchen. Wenn Sie eine Million Elemente zu mischen haben, aber Sie brauchen nur die ersten hundert, können Sie einfach die Sortierreihenfolge für die ersten hundert ausarbeiten und es gut nennen.
Das folgende erzeugt ein Array mit den Zahlen 1-100 in zufälliger Reihenfolge.
%Vor%Aus Ihrer Beschreibung entnehme ich, dass Sie ein Array von 100 Integer-Zahlen mit Werten von 1 bis 100 und keine doppelten Zahlen benötigen. Wenn die Zahlen Ganzzahlen sind, müssen Sie keine Zufallszahlen generieren, da alle möglichen Zahlen im Array sind. Daher können nur die Reihenfolge oder die Zahlen randomisiert werden.
Mit Linq und Jesper Palms Ansatz - mit Thomas Levesques Aussage erhalten Sie mit der folgenden Aussage das Array, das Sie brauchen.
%Vor%Die Methode ist sogar ziemlich schnell, definitiv effizienter als irgendwelche Vergleichsoperationen.
Um das Obige dem ursprünglichen Poster zu erklären, siehe Kommentar unten:
Enumerable.Range(1, 100)
erstellt einen Bereich von Ganzzahlen, der bei 1 beginnt und bei 100 endet. .Select(x => new { val = x, order = rnd.Next() })
erstellt ein neues temporäres Objekt, das den Wert und die Auftragsposition enthält, die durch eine Zufallszahl bestimmt wird. .OrderBy(i => i.order)
sortiert die temporären Objekte nach ihrer Reihenfolge. .Select(x => x.val)
wählt den Wert des temporären Objekts aus und konvertiert es zurück in int. .ToArray()
macht das Ganze wieder zu einem Array. Die verwendete Syntax ist LINQ, die in .NET 3.5 verfügbar ist. Bei älteren Versionen müssen Sie es selbst implementieren, was sehr viel komplizierter und länger ist.
Nach Erics Kommentar: Wenn Shuffeling erforderlich ist, können Sie den Code wie folgt machen
%Vor%Hier ist eine naive Implementierung:
%Vor%Aber es wäre ziemlich ineffizient, besonders am Ende des Arrays ...
Eine bessere Lösung wäre, dass Sie, da Sie 100 unterschiedliche Werte von 1 bis 100 in zufälliger Reihenfolge haben möchten, Ihr Array eventuell alle möglichen Werte von 1 bis 100 enthalten wird. Sie müssen also nur eine Sequenz daraus generieren Werte und "mische" es:
%Vor%EDIT: ein besserer Ansatz, der für weniger spezifische Fälle funktionieren sollte:
%Vor%In Ihrem Fall würden Sie es so verwenden:
%Vor% von dem, was ich verstanden habe. Sie benötigen eine Sammlung von Ganzzahlen mit Zufallszahlen. Ich nehme an, mit int-Array oder Liste von int spielt keine Rolle.
Hier ist ein einfacher vollständiger Ansatz, den Sie beschrieben haben.
using System;
using System.Collections.Generic;
using System.Text;
Namespace FillRandom { Klassenprogramm { static void Haupt (string [] args) { int minWert = 1; int maxWert = 100; // Erstelle eine Liste von int mit einer Kapazität von 100 Listenfeld = neue Liste (100);
%Vor%}
Sie können ein Konsolenprojekt erstellen und es ausprobieren.