Autor Beitrag
Adabei
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: So 24.08.14 20:30 
Hallo nochmals. :wink2:

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...)

ausblenden 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(1500);
                    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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4795
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: 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 :nixweiss:), tut mir leid für meine schlechte ausdrucksweise :flehan:

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 :D
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Mo 25.08.14 13:25 
Also wenn ich dich richtig verstanden habe, willst du so ewtas in der Art machen:
ausblenden 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); // Liste erstellen, die deinem Zufallszahlenbereich entspricht.
Random rnd = new Random(); // Random generator erzeugen
int[] Zufall = rndNums.Sort((x1, x2) => rnd.Next(-12)).Take(100).ToArray(); // Zahlenliste durcheinander würfeln, anschließend die ersten 100 Zahlen nehmen und sie in ein Array umwandeln

foreach(int zahl in Zufall) m_lbAusgabe.Items.Add(zahl); // Zahlen durchgehen und in die Ausgabeliste eintragen
//oder, falls das geht (hab jetzt nicht nachgeschaut):
m_lbAusgabe.Items.AddRange(Zufall);

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Adabei Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: 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):

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
for (int i = 0; i <= 1; i++)//da ich ja nicht 6 zahlen wie beim lotto benötige sondern nur 1
{
zahl = rnd.Next(1100);//zufallszahl zwischen 1 und 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Mo 25.08.14 16:03 
eine foreach schleife?
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Mo 25.08.14 16:08 
Nächster Versuch ;)

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Mo 25.08.14 16:13 
dann wird es die while schleife sein
papa69
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 79
Erhaltene Danke: 23

Win 10, Ubuntu
C#, Java, C
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: 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#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: 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.
ausblenden 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.
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: 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:
ausblenden 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#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
int zahl = myList[myList.Count - 1];

int ergebnis = zahl + 5;
// du kannst aber auch einfach die Zahl direkt erhöhen, also
zahl = zahl + 5;
// oder gekürzt
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: 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.

ausblenden 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 :D