Lottoziehung
-
Kann mir jemand helfen, dass ich die Lottozahlen in meinem Programm nicht mehr doppelt habe? Wenn i zurückgesetzt wird, dann wird ein Wert überschrieben, das muss ich ändern.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Arrays { class Program { static void Main(string[] args) { int AnzahlZahlen = 6; int AnzahlKugeln = 6; int[] lotto; lotto = new int[AnzahlZahlen]; Random rnd = new Random(); for (int i = 0; i < lotto.Length; i++) { bool doppelt = false; int zufallszahl = rnd.Next(1, AnzahlKugeln); for (int a = 0; a < lotto.Length; a++) { if (lotto[a] == zufallszahl) doppelt = true; } if (doppelt == true) { i--; } else { break; } lotto[i] = zufallszahl; } for (int i = 0; i < lotto.Length; i++) { Console.WriteLine(lotto[i]); } Console.ReadLine(); } } }
-
1. Du solltest bedenken das du mit der Random Klasse, wenn du sie ohne Seed initialisierst, immer die gleichen Zahlen in der gleichen Reihenfolge bekommst.2. Arbeite mit Container nicht mit Arrays.
3. Beachte konsistente groß und Kleinschreibung der Variablen.
4. Schreib die Bezeichner lieber auf Englisch.
Das Problem würde ich so lösen:
a. Initialisiere die Random mit einem Seed (second zb)
b. Erstelle eine Liste mit integern
c. Fülle die Liste mit den Zahlen 1-6
d. Sortiere die Liste anhand Guids.Hier mal ungetester Pseudocode (Hier im Forum getippt)
static void Main(string[] args) { var numbers = GetNumbers(6, 6); } private static List<int> GetNumbers(int numberCount, int availableCount) { Contract.Assume(availableCount <= numberCount, "The availbale numbers must be more (or equal) then the numbers to catch"); var numbers = new List<int>(); for (int i = 1; i <= availableCount; ++i) numbers.Add(i); numbers.Sort(s => Guid.NewGuid()); return numbers.GetRange(0, numberCount); }
-
gotosharp schrieb:
Kann mir jemand helfen, dass ich die Lottozahlen in meinem Programm nicht mehr doppelt habe? Wenn i zurückgesetzt wird, dann wird ein Wert überschrieben, das muss ich ändern.
Dein Setup "6 aus 6" ist natürlich auch.. etwas widersinnig, besonders weil die Next-Methode von Random den min-Value als inklusive und den max-Value als exklusive Grenze definiert.. das heißt du wirst gar keine 6 unterschiedlichen Zahlen erhalten, denn die kleinste Zahl muss mindestens 1 sein und die größte maximal 5.
Es gibt da eine recht simple Methode, um dein Problem zu lösen:
int anzahlZahlen = 6; int anzahlKugeln = 6; Random r = new Random(DateTime.Now.Second); HashSet<int> lottoZahlen = new HashSet<int>(); while (lottoZahlen.Count < anzahlZahlen) { int zahl = r.Next(1, anzahlKugeln + 1); //+1 wegen der exklusiven Max-Grenze! if (lottoZahlen.Contains(zahl)) continue; lottoZahlen.Add(zahl); }
-
David W schrieb:
1. Du solltest bedenken das du mit der Random Klasse, wenn du sie ohne Seed initialisierst, immer die gleichen Zahlen in der gleichen Reihenfolge bekommst.
MSDN schrieb:
Initializes a new instance of the Random class, using a time-dependent default seed value.
-
MSDN schrieb:
David W schrieb:
1. Du solltest bedenken das du mit der Random Klasse, wenn du sie ohne Seed initialisierst, immer die gleichen Zahlen in der gleichen Reihenfolge bekommst.
MSDN schrieb:
Initializes a new instance of the Random class, using a time-dependent default seed value.
public Random() : this(Environment.TickCount)
Stimmt, mein Fehler. Danke für den hinweis
-
Vielen Dank für die Hilfe.
@GPC: Das sieht sehr interessant aus, habe auch gerade einen Thread eröffnet, wo ich das genau so machen soll. Nur wie muss dann die Ausgabe auf dem Bildschirm programmiert werden?using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Lotto___List { class Program { static void Main(string[] args) { int anzahlZahlen = 6; int anzahlKugeln = 49; List<int> lotto; lotto = new List<int>(); Random rnd = new Random(); while (lotto.Count < anzahlZahlen) { int zahl = rnd.Next(1, anzahlKugeln + 1); if (lotto.Contains(zahl)) continue; lotto.Add(zahl); } //Console.WriteLine(lotto[]); Console.ReadLine(); } } }
Das kommt ja bei mir so nicht hin;)
-
Dein anderer Thread ist recht wirr und ich bin zu faul, da groß Sinn rauszulesen
Aber für die Ausgabe der Lottozahlen bist du ja schon fast am Ziel.
Es gibt da mehrere Varianten:
string result = String.Join(", ", lotto); Console.WriteLine(result);
string result = lotto.Select(x => x.ToString()).Aggregate((acc, x) => acc + ", " + x); Console.WriteLine(result);
Und die für lam0r:
string result = ""; foreach (var zahl in lotto) result += zahl.ToString() + ", "; result = result.Substring(0, result.LastIndexOf(',')); Console.WriteLine(result);
Wenn du noch sortieren willst, musst du vor der Augabe natürlich einmal die Sort-Methode von List<T> aufrufen: lotto.Sort();
Außerdem habe ich doch ein HashSet<T> benutzt und keine List<T>. Das hab ich schon aus gutem Grund gemacht, denn ein Contains-Aufruf ist für HashSet sehr schnell und für List<T> viel langsamer. Bei den geringen Datenmengen hier fällt das zwar nicht ins Gewicht, aber man sollte es sich merken, wenn man sowas mit vielen Daten macht oder in einer Schleife etc.
-
Versuch es mal mit mitdenken.