Lottowahrscheinlichkeit 6 aus 49 (out of memory)

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Hobbl.

    Lottowahrscheinlichkeit 6 aus 49 (out of memory)

    Edit by ErfinderDesRades: (Thema verschoben) Bitte richtiges UnterForum wählen!

    Ich habe auf Form1 einen Lottozettel mit GDI gezeichnet,
    dort kann man 12 x "6 aus 49" ankreuzen.


    Nach einem Click auf „Berechnen“ generiert es mir, in einem Timer alle 100ms, 6 Zufallszahlen (keine doppelten), die in Form2 in einem DGV1
    angezeigt werden und mit den angekreuzten Zahlen vergleicht.(Treffer zeigt es mir auch
    schon im DGV grün an).


    In Form2, wird auch in
    7 Labeln angezeigt wie oft ein 0er, 1er, 2er …. getroffen wurde.


    Unter den Labels sind wieder
    7 DGV, die mir das Datum anzeigen wann eben ein 0er, 1er, 5er … getroffen
    wird( In Form1 kann man auswählen ob Samstag, Mittwoch oder beides ).


    Mit einem Click auf das Datum, kommt auch sofort in DGV1, der entsprechenden Treffer.


    Das alles funktioniert auch wunder bar.


    Nur ist es halt so, daß ein 6er ziemlich unwahrscheinlich ist (das kann
    mehrere 100 oder auch mehrere 1000 Jahre dauern)(Die Berechnung selber dauert
    ja auch mehrere Std)


    Mir läuft auf jeden Fall mein Arbeitsspeicher über. (fast 1,5 GB von 8 GB) (out of memory schlag mich tot) kommt
    als Fehler.


    Jetzt hab ich mir gedacht, vielleicht kann man das Ganze mit
    einem Dataset lösen und hab mir auch die 4Views von Edr angeschaut.


    Dachte mir das man vielleicht alle 500 Jahre, oder alle 200MB das Ganze in mehrere Xml .dateien speichert und bei einem Click auf
    das Datum die entsprechende „xml „wieder läd.



    Fragen: Bin ich mit einem Dataset auf einem Holzweg?
    Wie kann ich "Out of Memory" vermeiden?

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Das hört sich danach an, dass du ganz viele ungenutzte Ressourcen im RAM lässt, selbst wenn du sie nicht mehr brauchst. Aber um das zu bestätigen brauchen wir Code ;)
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    Hobbl schrieb:

    Holzweg
    Sieht so aus.
    In Deinem Algo sind mindestens 2 Fehler:
    1. Er dauert zu lange (bezogen auf den 100-ms-Timer-Takt,
    2. Er verschlingt Ressourcen.
    ==>
    Mach Dir einen Elementaralgorithmus, der dauert weniger als 0,5 Millisekunden, mach danach eine GUI dazu.
    Schreibe nix zwischendurch auf Platte, denn da ist nix zu schreiben.
    Was soll eigentlich dargestellt werden?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Habe das ganze jetzt mal in eine Form gepackt.

    Hier mal der Code:
    Spoiler anzeigen

    Quellcode

    1. Public Class Form1
    2. Private Datum As DateTime = DateTime.Now
    3. Private Lottozahl(6) As Integer
    4. Private GekreuzteZahl(6) As Integer
    5. Private Trefferanzahl As Integer
    6. Private Treffer(6) As Boolean
    7. Private Nr As Integer
    8. Private Anzahltreffer(6) As Integer
    9. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    10. Randomize()
    11. btn_berechnen.Text = "Berechnung starten"
    12. Timer1.Interval = 10
    13. Timer1.Enabled = False
    14. If Datum.DayOfWeek = DayOfWeek.Sunday Then Datum = Datum.AddDays(6) ' Hier wird der nächste Samstag gesucht
    15. If Datum.DayOfWeek = DayOfWeek.Monday Then Datum = Datum.AddDays(5)
    16. If Datum.DayOfWeek = DayOfWeek.Tuesday Then Datum = Datum.AddDays(4)
    17. If Datum.DayOfWeek = DayOfWeek.Wednesday Then Datum = Datum.AddDays(3)
    18. If Datum.DayOfWeek = DayOfWeek.Thursday Then Datum = Datum.AddDays(2)
    19. If Datum.DayOfWeek = DayOfWeek.Friday Then Datum = Datum.AddDays(1)
    20. GekreuzteZahl(1) = 23 'Zahlen ankreuzen
    21. GekreuzteZahl(2) = 45
    22. GekreuzteZahl(3) = 7
    23. GekreuzteZahl(4) = 14
    24. GekreuzteZahl(5) = 46
    25. GekreuzteZahl(6) = 13
    26. Label1.Text = GekreuzteZahl(1).ToString
    27. Label2.Text = GekreuzteZahl(2).ToString
    28. Label3.Text = GekreuzteZahl(3).ToString
    29. Label4.Text = GekreuzteZahl(4).ToString
    30. Label5.Text = GekreuzteZahl(5).ToString
    31. Label6.Text = GekreuzteZahl(6).ToString
    32. End Sub
    33. Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    34. ZufälligeLottozahlenerstellen()
    35. Trefferberechnen()
    36. DGVs_aktualisieren()
    37. Trefferanzahl = 0
    38. Nr = Nr + 1
    39. Datum = Datum.AddDays(7)
    40. End Sub
    41. Private Sub btn_berechnen_Click(sender As System.Object, e As System.EventArgs) Handles btn_berechnen.Click
    42. Timer1.Enabled = Not Timer1.Enabled
    43. If Timer1.Enabled Then
    44. btn_berechnen.Text = "Berchnung anhalten"
    45. Else
    46. btn_berechnen.Text = "Berechnung fortsetzen"
    47. End If
    48. End Sub
    49. Private Sub ZufälligeLottozahlenerstellen()
    50. Dim z As Integer
    51. Dim Zufallszahl As Integer
    52. Dim Result As Boolean
    53. While z < 6
    54. z = z + 1
    55. Do
    56. Zufallszahl = CInt(Int(49 * Rnd() + 1)) ' Ziehung der Lottozahlen
    57. Result = True
    58. For i = 1 To z - 1
    59. If Lottozahl(i) = Zufallszahl Then ' Doppelte Lottozahlen vermeiden
    60. Result = False : Exit For
    61. End If
    62. Next
    63. Loop Until Result = True
    64. Lottozahl(z) = Zufallszahl
    65. End While
    66. End Sub
    67. Private Sub Trefferberechnen()
    68. For t = 1 To 6
    69. For i = 1 To 6
    70. If GekreuzteZahl(t) = Lottozahl(i) Then
    71. Treffer(i) = True
    72. Trefferanzahl = Trefferanzahl + 1
    73. End If
    74. Next
    75. Next
    76. End Sub
    77. Private Sub DGVs_aktualisieren()
    78. DGV_Hauptanzeige.Rows.Add(Nr.ToString, (Datum.ToString("ddd. dd.MM.yyyy")), 1, Lottozahl(1), Lottozahl(2), Lottozahl(3), Lottozahl(4), Lottozahl(5), Lottozahl(6), Trefferanzahl.ToString & "er")
    79. For w = 1 To 6
    80. If Treffer(w) = True Then
    81. DGV_Hauptanzeige.Rows(Nr).Cells(w + 2).Style.BackColor = Color.DarkGreen 'Treffer werden im DGV_Hauptanzeige grün hinterlegt
    82. DGV_Hauptanzeige.Rows(Nr).Cells(w + 2).Style.ForeColor = Color.White
    83. Treffer(w) = False
    84. End If
    85. Next
    86. If Trefferanzahl = 0 Then
    87. Anzahltreffer(0) = Anzahltreffer(0) + 1
    88. lbl_0er.Text = Anzahltreffer(0).ToString & " mal 0 Richtige"
    89. DGV_0er.Rows.Add(Nr.ToString, Datum.ToString("ddd. dd.MM.yyyy"))
    90. ElseIf Trefferanzahl = 1 Then
    91. Anzahltreffer(1) = Anzahltreffer(1) + 1
    92. lbl_1er.Text = Anzahltreffer(1).ToString & " mal 1 Richtiger"
    93. DGV_1er.Rows.Add(Nr.ToString, Datum.ToString("ddd. dd.MM.yyyy"))
    94. ElseIf Trefferanzahl = 2 Then
    95. Anzahltreffer(2) = Anzahltreffer(2) + 1
    96. lbl_2er.Text = Anzahltreffer(2).ToString & " mal 2 Richtige"
    97. DGV_2er.Rows.Add(Nr.ToString, Datum.ToString("ddd. dd.MM.yyyy"))
    98. ElseIf Trefferanzahl = 3 Then
    99. Anzahltreffer(3) = Anzahltreffer(3) + 1
    100. lbl_3er.Text = Anzahltreffer(3).ToString & " mal 3 Richtige"
    101. DGV_3er.Rows.Add(Nr.ToString, Datum.ToString("ddd. dd.MM.yyyy"))
    102. ElseIf Trefferanzahl = 4 Then
    103. Anzahltreffer(4) = Anzahltreffer(4) + 1
    104. lbl_4er.Text = Anzahltreffer(4).ToString & " mal 4 Richtige"
    105. DGV_4er.Rows.Add(Nr.ToString, Datum.ToString("ddd. dd.MM.yyyy"))
    106. ElseIf Trefferanzahl = 5 Then
    107. Anzahltreffer(5) = Anzahltreffer(5) + 1
    108. lbl_5er.Text = Anzahltreffer(5).ToString & " mal 5 Richtige"
    109. DGV_5er.Rows.Add(Nr.ToString, Datum.ToString("ddd. dd.MM.yyyy"))
    110. ElseIf Trefferanzahl = 6 Then
    111. Anzahltreffer(6) = Anzahltreffer(6) + 1
    112. lbl_6er.Text = Anzahltreffer(6).ToString & " mal 6 Richtige"
    113. DGV_6er.Rows.Add(Nr.ToString, Datum.ToString("ddd. dd.MM.yyyy"))
    114. Timer1.Enabled = False 'Erst bei 6 Richtige wird die Berechnung angehalten
    115. btn_berechnen.Text = "Berechnung fortsetzen"
    116. End If
    117. End Sub
    118. Private Sub DGV_0er_CellContentClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV_0er.CellContentClick
    119. DGV_Hauptanzeige.FirstDisplayedScrollingRowIndex = DGV_0er.CurrentRow.Cells(0).Value
    120. End Sub
    121. Private Sub DGV_1er_CellContentClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV_1er.CellContentClick
    122. DGV_Hauptanzeige.FirstDisplayedScrollingRowIndex = DGV_1er.CurrentRow.Cells(0).Value
    123. End Sub
    124. Private Sub DGV_2er_CellContentClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV_2er.CellContentClick
    125. DGV_Hauptanzeige.FirstDisplayedScrollingRowIndex = DGV_2er.CurrentRow.Cells(0).Value
    126. End Sub
    127. Private Sub DGV_3er_CellContentClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV_3er.CellContentClick
    128. DGV_Hauptanzeige.FirstDisplayedScrollingRowIndex = DGV_3er.CurrentRow.Cells(0).Value
    129. End Sub
    130. Private Sub DGV_4er_CellContentClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV_4er.CellContentClick
    131. DGV_Hauptanzeige.FirstDisplayedScrollingRowIndex = DGV_4er.CurrentRow.Cells(0).Value
    132. End Sub
    133. Private Sub DGV_5er_CellContentClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV_5er.CellContentClick
    134. DGV_Hauptanzeige.FirstDisplayedScrollingRowIndex = DGV_5er.CurrentRow.Cells(0).Value
    135. End Sub
    136. Private Sub DGV_6er_CellContentClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV_6er.CellContentClick
    137. DGV_Hauptanzeige.FirstDisplayedScrollingRowIndex = DGV_6er.CurrentRow.Cells(0).Value
    138. End Sub
    139. End Class


    Das ganze ist schon sowas wie eine Endlosschleife, weil die Berechnung eben erst bei einem 6er anhält.

    So sieht das ganze zur Laufzait aus:
    Bilder
    • Lottowahrscheinlichkeit.png

      161,93 kB, 1.000×503, 193 mal angesehen

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

    offensichtlich zeigst du insgesamt ungefähr 10000 Datensätze an, davon 5000 mit 11 Spalten. Kann schon sein, dass das bisserl viel ist, weil du die Datenhaltung ja auch direkt in den DGVs machst, anstatt in einem typisierten Dataset.

    guggemol Daten laden, speichern, verarbeiten
    Dein Fall ist noch viel einfacher, du brauchst ja nur eine einzige Tabelle.
    Diese Tabelle kannst du ja über mehrere BindingSources verschieden gefiltert an verschiedene DGVs binden - ich denke, 10000 Datensätze machen die dann schon mit - sicher bin ich aber nicht.

    Weil im richtigen Leben guckt niemand jemals eine Tabelle mit mehr als 1000 Datensätzen an.
    @Hobbl:: Ignoriere die Nuller und ggf. auch die Einer.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ErfinderDesRades schrieb:

    Hmm! Zahlen ignorieren.

    Bei dieser Berechnung ist noch nicht mal eine Superzahl oder eine Super6 dabei, geschweige denn ein Spiel77.
    So sieht die zweite Form aus:


    Aber ich glaube auch das die 0er und 1er raus müssen, das sind mehr als 80% an Daten. X(
    Bilder
    • Lottwahrscheinlichkeit1.png

      196,43 kB, 1.000×508, 197 mal angesehen

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

    @Hobbl:: Löse das Problem (zunächst) ohne GUI.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok!
    Werde das ganze dann doch mal mit einem Dataset probieren.(Danke an EdR für die tollen Filme)
    Und die 0er, 1er, 2er kommen raus!(nur ignorieren ist "glaub ich" auch nicht gut).

    Der kleinste Gewinn geht eh erst mit einem 2er+Zz los.