Ich möchte ein Array erzeugen, das 144 Zahlen von 1-> 36 in zufälliger Reihenfolge hat (also wird jede Zahl 4 mal wiederholt). Können wir Enumerable.Repeat und Enumerable.Range dazu verwenden? Wenn ja, bitte erklären Sie mir wie?Generiere und wiederhole die Nummer in C#
Antwort
Nun, mit allen Zahlen die Reihenfolge der Erstellung in ist einfach:
var items = from x in Enumerable.Range(1, 36)
from y in Enumerable.Repeat(x, 4)
select y;
Dann können Sie einfach ToArray
verwenden Sie es in ein Array zu bekommen und mische es. Es gibt zahlreiche Fragen zum Mischen eines Arrays in C# auf SO, z. B. this one. Sie können diesen Code entweder direkt verwenden oder ToArray
aufrufen und das Array an Ort und Stelle mischen, ohne es am Ende zu verlieren.
int[] numbers = Enumerable.Range(0, 144).Select(i => (i % 36)+1).OrderBy(g => Guid.NewGuid()).ToArray();
Wahrscheinlich nicht wichtig in diesem Fall, aber diese Art des Mischens endet als O (n log n), wo es nur O sein muss (n). –
// Generate the list (not in random order)
var one_to_36 = Enumerable.Range(1, 36);
var lst = one_to_36.Concat(one_to_36).Concat(one_to_36).Concat(one_to_36).ToList();
// Randomize the list by swapping random elements
Random rnd = new Random();
for(int i = 0; i < lst.Count; i++)
{
int i1 = rnd.Next(lst.Count);
int i2 = rnd.Next(lst.Count);
int tmp = lst[i1];
lst[i1] = lst[i2];
lst[i2] = tmp;
}
Der Austausch von zufälligen Elementen auf diese Weise ergibt keine gute zufällige Verteilung - es gibt eine bessere Möglichkeit, eine Sammlung zu mischen, wie in meiner Antwort verlinkt. –
Ich habe das nicht bemerkt ... danke für den Tipp –
var seq = Enumerable.Range(0, 144);
var all = seq.ToList();
var random = new Random();
var result = seq.Select(i => {
var index = random.Next()%all.Count;
var r = all[index] % 36 + 1; all.RemoveAt(index);
return r;
}).ToList();
- 1. Javascript/html: Wie generiere ich eine Zufallszahl zwischen Nummer A und Nummer B?
- 2. Generiere ein riesiges Bild in C#
- 3. Generiere große Zahlen mit srand() in c
- 4. Generiere Zahlen und schreibe sie in die Zwischenablage
- 5. Generiere Wiki-Dokumentation für C#?
- 6. Länge von 'char * Nummer Liste []' in C und C++
- 7. Nummer in Zeichenfolge ersetzen - C#
- 8. C# - Nummer erhöhen und Nullstellen vorhalten
- 9. C# und der Oracle-Nummer-Datentyp
- 10. Problem mit C# und TextMode = "Nummer"
- 11. C++ Nummer validieren und unendlich Schleife stoppen
- 12. Build-Nummer in C# Datei
- 13. C#/Java-Nummer Randomisierung
- 14. Generiere Methodenaufrufe C# mit einer Schleife
- 15. Generiere Sequenznummer in Android
- 16. Generiere JSON in Schleife
- 17. Generiere C# -Code für Oracle-Tabelle
- 18. C# Formatierung Nummer
- 19. Überprüfen Sie eine Nummer in SQL Server und generieren Sie dann eine eindeutige Nummer in C#
- 20. Wie wiederhole ich Gruppen in Regex (für C#)
- 21. MATLAB: wiederhole Zeilenvektor in mehreren Dimensionen
- 22. Wiederhole Spalten in einer Tabelle
- 23. Wie wiederhole ich die Textur wie GL_REPEAT?
- 24. AngularJS - Wiederhole ein div und eine Taste
- 25. Wie die Nummer eines Monats in C# Funktion zurück
- 26. Wie wiederhole ich eine Zeichenfolge in C++ beliebig oft?
- 27. Wie generiere ich Zufallszahlen in zwei verschiedenen Arrays? (C++)
- 28. Wie generiere ich COM-Interop-Proxies in C# -Quellcode?
- 29. Wie wandle ich die Nummer (dec) in die binäre (bin) Nummer und von bin in dec um?
- 30. Wie wird die 12-stellige Nummer in C verwendet?
hey, das ist besser lesbar als meine Lösung. +1 –
und eleganter, dass meine mehrere Concat;) –
danke für den Kommentar, aber jetzt muss ich die generierte Array zu einem [9,16] -Array füllen, können Sie einen guten Weg für mich vorschlagen? –