Autor |
Beitrag |
Adabei
      
Beiträge: 33
|
Verfasst: So 24.08.14 20:30
Hallo nochmals.
Schreibe gerade eine einfaches Programm, welches Zufallszahlen generieren soll(nicht mehr aber auch nicht weniger).
Das mit den Zufallszahlen habe ich ohne weiteres zusammengebracht(war auch teilweise im meinem Buch beschrieben), da aber einige Zahlen immer doppelt vorkommen, wollte ich wissen, wie es denn möglich ist, zufallszahlen ohne Wiederholung in einer lb. auszugeben?
Momentan sieht der Code so aus(halt manchmal noch immer mit Wiederholung...)
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Random r = new Random();
int[] Zufall = new int[100];
m_lbAusgabe.Items.Clear();
for (int i = 0; i < 100; i++) { Zufall[i] = r.Next(1, 500); m_lbAusgabe.Items.Add(Zufall[i]); } |
da ich mich hier schon mal etwas eingelesen habe in die beiträge von lottozahlen generieren(da es ja ähnlich ist nur mit anderen zahlen) habe ich gesehen, dass man in die for-schleife noch eine for-schleife reinpacken soll, aber wie soll denn das gehen?
grüße
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 24.08.14 20:40
Du kannst natürlich mit einer zweiten Schleife nachschauen, ob die Zahl schon enthalten ist und sie dann nicht nutzen.
Viel sinnvoller ist aber eine Liste der Zahlen zu benutzen, in deren Range die Zufallszahlen liegen sollen, und diese einfach zu schütteln, sprich zufällig zu sortieren, siehe Fisher-Yates:
en.wikipedia.org/wik...2%80%93Yates_shuffle
Wenn du jetzt die ersten 100 dieser Zahlen benutzt, sind das 100 zufällige Zahlen aus diesem Bereich.
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: So 24.08.14 20:58
Zitat: | da ich mich hier schon mal etwas eingelesen habe in die beiträge von lottozahlen generieren(da es ja ähnlich ist nur mit anderen zahlen) habe ich gesehen, dass man in die for-schleife noch eine for-schleife reinpacken soll, aber wie soll denn das gehen? |
Wenn du es wie bei den Lotozahlen willst dann mach es doch genauso wie bei den Lottozahlen
a.) Ein Liste mit den möglichen Zahlen erstellen
b.) Ein zufällig auswählen aus der Liste aus a. entfernen und irgendwo eintragen
c.) So oft b.) wiederholen bis man die gewünschte Menge hat
|
|
Adabei 
      
Beiträge: 33
|
Verfasst: Mo 25.08.14 10:41
das mit den Listen ist natürlich eine Möglichkeit, leider kenne ich mich damit zu wenig aus und würde es lieber mit 2 for-schelifen probieren. Nur verstehe ich leider auch diese Möglichkeit nicht ganz, ich meine von der theorie her schon, denn die zweite for-schleife muss einfach prüfen, ob die zahl schon mal vorgekommen ist, aber wie dass geht verstehe ich leider nicht
|
|
Th69
      

Beiträge: 4795
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mo 25.08.14 10:49
Hallo Adabei,
unter C# Zufallszahlengenerator am Beispiel Lotto findest du entsprechenden Code, der dir weiterhelfen sollte.
Aber eigentlich solltest du so etwas simples selber hinkriegen...
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 25.08.14 10:59
Du mußt prüfen ob das was du gewürfelt hast schon in m_lbAusgabe.Items ist. Dazu hat die Collection eine Contains Methode. Dann nur etwas hinzufügen wenn es noch nicht enthalten ist.
Eine 2.te Schleife brauchst du nicht. Die die du hast muß nur solange laufen bis die benötigte Menge in m_lbAusgabe.Items ist.
Also aus der "mache etwas 100 mal"-Schleife muß eine "bis 100 Elemente in m_lbAusgabe.Items sind"-Schleife werden.
Sei dir aber bewußt das du so keine saubere Abbruchbedingung hast. Wie oft die Schleife durchlaufen wird ist nicht vorhersagbar und (kann zumindest theoretisch lange oder nahezu unendlich dauern).
|
|
Adabei 
      
Beiträge: 33
|
Verfasst: Mo 25.08.14 13:00
ich glaube ich habe die Frage so gestellt, dass sie falsch ankommt(oder vl. beudetet die Frage auch was falsches  ), tut mir leid für meine schlechte ausdrucksweise
ich möchte wenn der Benutzer auf den Button klickt, dass 1 Zufallszahl gemacht wird, und die dann in der l-Box ausgegeben wird, wenn er dann wieder draufklickt, dass dann wieder 1 Zufallszahl kommt, die halt nicht die gleiche sein soll, wie die eine, die schon mal vorkommt.
Danke für den Link, dort ist es wirklick schritt für schritt beschrieben, aber ich denke ich habe zuerst die Frage falsch gestellt und zur besseren Frage(hoffentlich) passt dann der Link nicht mehr;
ok, also keine 2. Schleife, dass habe ich jetzt schon geschnallt 
|
|
C#
      
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: Mo 25.08.14 13:25
Also wenn ich dich richtig verstanden habe, willst du so ewtas in der Art machen:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| List<int> rndNums = new List<int>(); for (int i = 1; i < 500; i++) rndNums.Add(i); Random rnd = new Random(); int[] Zufall = rndNums.Sort((x1, x2) => rnd.Next(-1, 2)).Take(100).ToArray(); foreach(int zahl in Zufall) m_lbAusgabe.Items.Add(zahl); m_lbAusgabe.Items.AddRange(Zufall); |
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
|
|
Adabei 
      
Beiträge: 33
|
Verfasst: Mo 25.08.14 15:12
nein so mein ich dass auch nicht, also ich glaube dass es so geht(habe ich mithilfe der link-anleitung gemacht):
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| for (int i = 0; i <= 1; i++){ zahl = rnd.Next(1, 100);if (!myList.Contains(zahl)) { myList.Add(zahl); } else { i--; } } |
nach dieser variante ist diese 1 Zufallszahl in der Liste myList gespeichert. diese 1 Zufallsvariable brauche ich dann außerhalb dieser schleife als int. Da sie aber in einer Liste gespeichert ist funktioniert dass nicht.
bei einer zufallsvariable glaube ich dass ich sowieso keine schleife benötige oder?, weil ich brauch sie ja nur 1-mal.
edit: Blödsinn, natürlich brauche ich eine Schleife, weil sonst geht es ja nicht von i eins hinunterzuzählen)
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 25.08.14 15:34
Zitat: | edit: Blödsinn, natürlich brauche ich eine Schleife, weil sonst geht es ja nicht von i eins hinunterzuzählen) |
Bonusaufgabe. Welche Schleife eignet sich hier am besten? (zumindest besser als eine For Schleife)
|
|
Adabei 
      
Beiträge: 33
|
Verfasst: Mo 25.08.14 16:03
|
|
C#
      
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: Mo 25.08.14 16:08
Nächster Versuch 
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 25.08.14 16:13
Tip: Die Schleife soll mindestens 1 mal ausgeführt werden und solange wiederholt werden bis (hier folgt die Schleifenbedingung) die in der schleife gewürfelte Zahl nicht in myList zu finden ist.
|
|
Adabei 
      
Beiträge: 33
|
Verfasst: Mo 25.08.14 16:13
dann wird es die while schleife sein
|
|
papa69
      
Beiträge: 79
Erhaltene Danke: 23
Win 10, Ubuntu
C#, Java, C
|
Verfasst: Mo 25.08.14 16:15
@Adabei:
Ich glaub', du siehst den Wald vor lauter Bäumen nicht... wenn du "die" Zahl in der List(e) hast, kannst du sie doch auch auslesen (aus der List(e))
_________________ Daniel Bauer
... fatal ist nur, wenn sich das Licht am Ende des Tunnels als entgegenkommender ICE entpuppt ...
|
|
Adabei 
      
Beiträge: 33
|
Verfasst: Mo 25.08.14 16:22
ich denke auch dass ich gerade voll auf der leitung stehe
ich setze mich morgen nochmal in ruhe vor dem computer und dann werde ich es nochmals
versuchen
|
|
C#
      
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: Mo 25.08.14 16:39
Also, mal abgesehen von deiner Idee mit der Schleife, guck dir nochmal meine Methode an. Wenn man diese etwas modifiziert brauchst du überhaupt keine Schleife.
C#-Quelltext 1: 2:
| List<int> ZufallsZahlen = new List<int>(); for(int i = rndMin; i < rndMax; i++) ZufallsZahlen.Add(i); |
Jetzt hast du alle möglichen Zahlen in einer Liste, sodass sie nur einmal vorkommen. rndMin und rndMax ist hier dein Mini- bzw. Maximum der Zufallszahlen.
C#-Quelltext 1: 2: 3: 4:
| Random rdm = new Random(); int index = rdm.Next(0, ZufallsZahlen.Count); myList.Add(ZufallsZahlen[index]); ZufallsZahlen.RemoveAt(index); |
Wenn du dir diesen Codeblock ansiehst, wirst du feststellen, dass hier eine beliebige Zahl aus der ZufallsZahlen-Liste genommen und in myList eingetragen wird. Anschließend wird diese Zahl aus der ZufallsZahlen-Liste gelöscht. Somit kann jede Zahl nur genau 1x vorkommen.
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
|
|
Adabei 
      
Beiträge: 33
|
Verfasst: Mo 25.08.14 19:55
nun ja, ich habe jetzt in Ruhe darüber nachgedacht, es funktioniert ohne Probleme so wie ihr es mir erklärt habt, danke dafür!!!
jetzt will ich allerdings mit dieser 1 Zufallszahl die ich in der Liste gespeichert habe arbeiten, also konkret will ich 5 dazuzählen;
dazu muss ich diese Zufallszahl in einer Variable speichern, in meinem Fall:
C#-Quelltext 1: 2:
| int zufallszahl=int ergebnis=zufallszahl+5; |
die zufallszahl ist in der Liste myList gespeichert.
Wie kann ich nun die Zufallszahl von der Liste myList in die neu erstellte int Variable zufallszahl rüberbringen?
zur info: myList habe ich als globale Variable erstellt(also auch außerhalb der for-schleife zu verwenden);
|
|
C#
      
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: Mo 25.08.14 20:02
Zeig mal deinen Code den du jetzt verwendest. Nach welcher Methode gehst du nun vor?
Wenn du die Zahl weiterverwenden willst, musst du sie wieder aus der Liste auslesen:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7:
| int zahl = myList[myList.Count - 1];
int ergebnis = zahl + 5; zahl = zahl + 5; zahl += 5; |
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Zuletzt bearbeitet von C# am Mo 25.08.14 20:03, insgesamt 1-mal bearbeitet
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Mo 25.08.14 20:02
So wie du sie auch in die Add-Methode bekommst. (Ich gehe von dem Beispiel von C# aus)
Schau dir dazu mal das Stichwort Indexer an, List hat so einen.
C#-Quelltext 1:
| var zufallszahl = ZufallsZahlen[index]; |
Das dann an die Add-Methode übergeben und anschließend weiter verarbeiten.
PS:
C#, dein Name irritiert mich immer und immer wieder 
|
|
|