Random

  • C#

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Hey Leute.
    Wir haben gerade in Mathe Zufälligkeit.
    Da dachte ich mir, schreibe ich mir ein kleines Programm...
    3 textboxen :
    Von, bis, wie-viele-versuche
    Und ein Start-button und ne Listbox....

    Allerdings war das am Ende gar nicht so leicht wie ich dachte...
    Bevor ich hier jetzt meinen völlig falschen Code poste ( Ich hab das mit Dictionarys versucht... ) wollte ich von euch hören, wie ich das am besten mache....
    Ich glaube ich mach mir das viel zu schwer. Ich hab nämlich jetzt für jeden eintarg in der Liste sein key geprüft ob der der Random Zahl entspricht, und dann die Value + 1 gerechnet...
    Und dann für für jede eintrag eine neues Listbox item erstellt, wenn der Timer gestoppt hat, und das hat er wenn alle versuche abgelaufen sind...
    Ich zig jetzt einfach doch mal den Code :
    Spoiler anzeigen

    Quellcode

    1. private void button1_Click(object sender, EventArgs e)
    2. {
    3. versuche = Convert.ToInt32(textBox3.Text);
    4. von = Convert.ToInt32(textBox1.Text);
    5. bis = Convert.ToInt32(textBox2.Text);
    6. for (int i = von; i < bis; i++)
    7. {
    8. liste.Add(i, 0);
    9. }
    10. jetzt = 0;
    11. timer1.Start();
    12. }
    13. private void timer1_Tick(object sender, EventArgs e)
    14. {
    15. jetzt += 1;
    16. if (jetzt <= versuche)
    17. {
    18. Random r = new Random();
    19. int rnd = r.Next(von, bis);
    20. foreach (var kvp in liste)
    21. {
    22. if (kvp.Key == rnd)
    23. {
    24. int bla = kvp.Value + 1;
    25. liste[rnd] = bla;
    26. }
    27. }
    28. }
    29. else
    30. {
    31. timer1.Stop();
    32. foreach (var kvp in liste)
    33. {
    34. listBox1.Items.Add(kvp.Key + " : " + kvp.Value);
    35. }
    36. }
    37. }



    Ich weiß nicht, ob ich da ganz anders rangehen soll, oder ob das schon der richtige Weg wahr....
    jedenfalls kommt als Fehler bei der foreach schleife
    "Die Auflistung wurde geändert. Der Enumerationsvorgang kann möglicherweise nicht ausgeführt werden."

    Danke für eure Hilfe...


    Edit by Manschula: Bitte auf das richtige Unterforum achten! --> Thema aus dem Offtopic verschoben, Präfix und Titel angepasst

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Manschula“ ()

    Du darfst nicht jedes mal Random neu erzeugen schieb es vor der Schleife.
    Noch besser pack es oben in deiner Klasse rein.

    Das mit der foreach schleife kann ich mir nicht erklären.
    Und vorallem warum ist das ganze in einem Timer?

    Yissu schrieb:

    Du darfst nicht jedes mal Random neu erzeugen schieb es vor der Schleife.

    Da "if" selbst in C# keine Schleife ist, sehe ich das Problem nicht ...

    Quellcode

    1. if (jetzt <= versuche)
    2. {
    3. Random r = new Random(); // außerhalb der Schleife, also korrekt
    4. int rnd = r.Next(von, bis);
    5. foreach (var kvp in liste)
    6. {
    Das für dein Problem ist das du in der ersten foreach-Schleife den Wert änderst das darfst du nicht.
    Versuchs mal mit einer For-Schleife so:

    Quellcode

    1. for(int i = 0;i < ARRAYCOUNT; i++)
    2. {
    3. MACH WAS
    4. }


    Dann kannst du die Liste oder was auch immer ohne Fehler bearbeiten.
    Oke. Das versuch ich gleich.
    Aber eine letzte Frage habe ich noch.
    Warum funktioniert diese einfache Codezeile nicht : ?

    liste[rnd] = liste[rnd].Value += 1;

    Das hätte im Eintrag wo der Key, der ein int ist = die random-Zahl ist die Value, die wie oft das schon drankam plus 1 gerechnet...
    Aber er meint int enthält keine Definition für Value... Irgendwie muss man das doch umformen können, oder ?

    Jebber schrieb:

    Echt nicht ?
    Oke-Nochmal. Ich hab in meiner Form :
    3 textboxen :
    Von, bis, wie-viele-versuche
    Und ein Start-button und ne Listbox....

    Gut so ?
    Echt nicht.

    Das ist nur die Wiederholung des bereits gesagten.
    Wesentlich wäre vlt. noch zu erwähnen, was eiglich passieren soll, wenn jmd. auf den Start-Button klickst.
    Ich ignorier dich kurz, damit ich nicht vergese was ich sagen wollte :
    Ich hab jetzt in der Listbox verschiedene Items. z.B :
    1 : 4
    2 : 3
    3 : 7
    4 : 6
    5 : 1
    6 : 5
    Wie kann ich jetzt einen bestimmten Wert ersetzen, wenn das was nach dem Doppelpunkt im Item kommt immer unterschiedlich ist ?

    Mein derzeitiger Code sieht so aus :

    Spoiler anzeigen

    Quellcode

    1. private void button1_Click(object sender, EventArgs e)
    2. {
    3. versuche = Convert.ToInt32(textBox3.Text);
    4. von = Convert.ToInt32(textBox1.Text);
    5. bis = Convert.ToInt32(textBox2.Text);
    6. jetzt = 0;
    7. if (jetzt <= versuche)
    8. {
    9. jetzt += 1;
    10. int rnd = r.Next(von, bis);
    11. for (int i = von; von <= bis; i++)
    12. {
    13. if (liste.ContainsKey(rnd))
    14. {
    15. liste[rnd] = liste[rnd] += 1;
    16. listBox1.Items.Insert(0, rnd + " : " + liste[rnd]);
    17. }
    18. else
    19. {
    20. liste.Add(rnd, 1);
    21. }
    22. }
    23. }
    24. }

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Jebber“ ()

    es wäre ECHT hilfreich, wenn du dich mal zurücklehnst und grübelst um dann mal mit einer vernünftigen Erklärung rüberzukommen, WAS du jetzt eigentlich machen willst, bzw was das Programm "machen" soll (also was der User sieht/erfährt und nicht wie du es "coden" willst". Denn ...

    Jebber schrieb:

    Quellcode

    1. jetzt = 0;
    2. if (jetzt <= versuche)
    3. {
    4. jetzt += 1;

    DAS geht schon mal jämmerlich ich die Hose ... (liegt daran, dass es keine If-Schleifen gibt!)
    ja.. Das mit den "if-Schliefen"hab ich jetzt auch gemerkt...
    Zum programm :
    Man soll eingeben können, wie viele Versuche man haben will, und dann soll der PC durch Zufall zahlen generieren und ausgeben : wie viele 1nsen gibt es , wie viele zweien... etc.
    Und man soll eben wählen können wie viele möglichkeiten es gibt. z.B. von 1 bis 6, wie bei einem Würfel...

    Ich habe das ganze jetzt so gelößt :

    if (jetzt <= versuche)
    {
    for (int i = 0; i <= versuche; i++)
    {
    jetzt += 1;
    int rnd = r.Next(von, bis);

    if (liste.ContainsKey(rnd))
    {
    liste[rnd] = liste[rnd] += 1;
    }
    else
    {
    liste.Add(rnd, 1);
    }

    }
    }
    Haaaalt Stop :
    Ich hab nähmlich noch eine Frage. Bei meinem Dictionary sind als Key nur ints. von 0 bis blablabla.
    kann ich die Liste jetzt nach den Keys sortieren ? Das 0 ganz oben ist, und z.B. 10 ganz unten, wenn man als "bis" 10 eingegeben hat... geht sowas ?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Jebber“ ()

    PS: Um die relativen Häufigkeiten auszurechnen muss ich ja absolute durch Versuche rechnen, oder ?
    ( liste / versuche ) * 100
    Aber kann das sein, dass das einfach gerundet wird ? Hmm.. ich weiß nicht... Da kommt immer 0 raus !
    Was kann ich blos tun ?

    Jebber schrieb:

    kann ich die Liste jetzt nach den Keys sortieren ?
    naja, man kann jede Liste sortieren.

    Jebber schrieb:

    ( liste / versuche ) * 100
    Aber kann das sein, dass das einfach gerundet wird ? Hmm.. ich weiß nicht... Da kommt immer 0 raus !

    Das ist c#. Wenn man da ints durch hundert teilt, sinds immer noch ints, also 33/100 = 0, weil 0,33 geht mit int ja nicht. Einfach umformulieren:
    ( liste*100) / versuche