Hallo ,
ich simuliere verschieden Ziehungen (z.B. n=1.000, 10.000 usw.) für 6 aus 49.
Die Ergebnisse der einzelnen Ziehungen speichere ich in tblDaten. Hieraus kann ich dann mit einer Abfrage die Häufigkeiten der einzelnen Zahlen ermitteln.
Da das für verschiedene n umständlich ist, wollte ich eine Funktion hierzu schreiben.
Public Function Häufigkeiten()
' Häufigkeiten bei 6 aus 49 und verschiedener Anzahl von Ziehungen
Dim db As Database, rs As Recordset, qdf As QueryDef
Dim strSQL As String, Anz As Long, N As Long, a As Long, k As Long
Dim zahl1, zahl2, zahl3, zahl4, zahl5, zahl6 As Long
Dim zz As Long
...
'Abfrage gestalten ---------------------------------------------------------------------------------------------------------------------------
strSQL = "SELECT tblDaten.Zahl1, tblDaten.Zahl2, tblDaten.Zahl3, tblDaten.Zahl4, tblDaten.Zahl5, tblDaten.Zahl6"
strSQL = strSQL & " FROM tblDaten"
strSQL = strSQL & " WHERE(((tblDaten.zahl1) = 13)) Or (((tblDaten.zahl2) = 13)) Or (((tblDaten.zahl3) = 13)) Or (((tblDaten.zahl4) = 13)) Or (((tblDaten.zahl5) = 13)) Or (((tblDaten.zahl6) = 13))"
Set db = CurrentDb
Set rs = db.OpenRecordset(strSQL)
Set qdf = db.CreateQueryDef("qryHäufigkeit", strSQL)
'set rs.OpenRecordset("qryHäufigkeit")
Anz = DCount("*", "qryHäufigkeit")
...
End Function
Der Code zeigt die Berechnung der Häufigkeit für die Zahl 13 und funktioniert so auch.
Ich möchte nun eine Schleife realisieren, dass ich alle Zahlen berechnet werden, d. h. in dem Code soll für 13 eine Variable stehen.
Ich scheitere immer, im Code
WHERE(((tblDaten_49.zahl1) = 13)) Or (((tblDaten_49.zahl2) = 13)) Or (((tblDaten_49.zahl3) = 13))...
die 13 mit einer Variablen ZZ auszudrücken.
Für ein Lösungsvorschlag wäre ich sehr dankbar
Gruß
Hallo,
vergiss es, das ist viel zu umständlich und viel zu langsam. Die gezogenen Zahlen gehören als je ein Datensatz in eine extra Tabelle mit einem Fremdschlüssel zur Ziehung. Bei 10000 Ziehungen sind dann in der Tabelle 60000 DS mit einer Spalte. Die Datenmenge ist die Gleiche.
Dann genügt eine einfache gruppierte Abfrage zur Ermittlungen der Häufigkeiten.
SELECT GezZahl, Count(GezZahl) AS Haeufigkeit FROM GezZahlen GROUP BY GezZahl
Die Abfrage braucht für 115.000 Zahlen ein Augenzwinkern.
Deine eigene Funktion kannst Du ersatzlos eindampfen.
Mit korrektem (normalisiertem) Aufbau kannst Du dann mit anderen einfachen Abragen weitere Auswertungen machen. Z.B. Kleinste, Höchste usw.
Du kannst dann auch ganz einfach rauskriegen welche Zahl noch nicht gezogen wurde, welche Zahl zuletzt usw. usw. alles aber nur mit dem richtigen Aufbau.
Und alles ohne VBA, keinen Buchstaben.
Hallo,
die Anfängerschwierigkeit liegt immer in der exakten Beschreibung des Problems.
Könnte man dieses, wäre man der Lösung schon nahe.
Ich ziehe 1000 Zahlungen und speichere diese in eine Tabelle tblDaten. Für jede Ziehung ein Datensatz:
Ziehung; Zahl1;Zahl2;Zahl3;Zahl4, Zahl5m Zahl6
1: 3, 34, 44, 8, 17, 41
2: 9, 12, 38, 27, 33, 17
3: 44, 18, 2, 5, 38, 39
...
1000: 41, 28, 12, 25, 18, 39
mit einer einfachen Abfrage bekomme ich dann die Häufigkeit einer Zahl:
SELECT tblDaten.Zahl1, tblDaten.Zahl2, tblDaten.Zahl3, tblDaten.Zahl4, tblDaten.Zahl5, tblDaten.Zahl6
FROM tblDaten
WHERE (((tblDaten.Zahl1)=13)) OR (((tblDaten.Zahl2)=13)) OR (((tblDaten.Zahl3)=13)) OR (((tblDaten.Zahl4)=13)) OR (((tblDaten.Zahl5)=13)) OR (((tblDaten.Zahl6)=13));
Im Beispiel die Häufigkeit für die Zahl 13. Dieses müsste ich 49 mal durchführen und das für eine verschieden Anzahl von Ziehungen.
Deshalb mein Versuch, die Abfrage in VBA zu realisieren:
Die Bearbeitungszeit und ein normalisierter Aufbau spielen keine Rolle, es handelt sich lediglich um ein kleines Zahlenexperiment (Will Lotto-Millionär werden :-) )
Gruß Liene
Hallo,
die Anfängerschwierigkeit liegt immer in der exakten Beschreibung des Problems.Das Problem habe ich exakt verstanden, nur Du die Lösung nicht. Der ist auch als Experiment völlig untauglich. Was hindert Dich daran die Zahlenreihe in einer Spalte zu erzeugen, statt in 6 Spalten ?
Die Tabelle sieht dann einfach so aus:
Ziehung GezZahl
1 3
1 34
1 44
1 8
1 17
1 41
2 9
2 12
2 38
2 27
2 33
2 17
usw.
Strukturiere das um, mache 2 Tabellen und Du hast keine Probleme mehr.
Mit Deiner Lösung kann man auch nichts lernen, das würde man in einer Datenbank niemals machen.
3: 44, 18, 2, 5, 38, 39
ZitatDie Bearbeitungszeit und ein normalisierter Aufbau spielen keine Rolle
Dann akzeptiere einfach, dass die Entwicklung einer Lösung etwas umständlicher ist und auch ihre Zeit benötigt. Wer es umständlich mag, sollte auch darin konsequent sein.
In Deinem (unsäglichen) Beispiel würde man die hardcodierte 13 durch einen Parameter ersetzen, der dann per Handeingabe oder Schleife variiert wird.
WHERE Zahl1 = paramZahl OR Zahl2 = paramZahl ...
Du solltest, wie es Klaus bereits vorschlug, zu jeder Ziehung 6 Datensätze anlegen - dann kann SQL vernünftig und schnell die Daten auswerten. Wenn auch die Reihenfolge der Ziehung von Interesse ist, braucht man noch eine Spalte für die Position, wann welche Zahl gezogen wurde. Über Ziehungsnummer, Position und Zahl kannst Du einen eindeutigen Mehrfachindex legen bzw als Primärschlüssel auslegen. Bei einem eindeutigen Mehrfachindex sollten alle 3 Felder als Pflichtfelder ausgelegt sein (
Eingabe erforderlich auf
Ja stellen). Gültigkeitsregeln für die Position wäre
Zwischen 1 Und 6 und für die Zahl
Zwischen 1 Und 49. Als Feldgröße reicht sogar ein platzsparendes Byte aus.
Daten für Ziehung 1:
z_nr | pos | zahl |
1 | 1 | 3 |
1 | 2 | 34 |
1 | 3 | 44 |
1 | 4 | 8 |
1 | 5 | 17 |
1 | 6 | 41 |
Hallo Liene,
I.Ü. lohnt es nicht sich damit zu beschäftigen. Bei 14Mio. Möglichkeiten
gibt es einfach noch nicht genügend Proben, können bis jetzt ja nur ein
paar Tausend Ziehungen sein, um irgendwelche Abweichungen in Richtung
Sigma 3 Grenze zu finden, nicht mal in 100 Jahren.
Datenbanktechnisch kann ich mich meinen Vorpostern nur anschliessen.
gruss ekkehard
Hallo,
@Beaker: über die "praktische Nutzlosigkeit" bin ich mir schon im klaren :)
Ansonsten ist meine Lösung:
strSQL = strSQL & " WHERE Zahl1=" & zz & "Or zahl2 = " & zz & " Or zahl3 = " & zz & " Or zahl4 = " & zz & " Or zahl5 = " & zz & " Or zahl6 = " & zz
eine Schleife mit n (verschieden Anzahl der Ziehungen) und zz =1 bis 49 brachte schnell den gewünschten Erfolg und eine Abschätzung des Erwartungswertes der Häufigkeiten im Vergleich mit den Häufigkeiten bei realen Ziehungen konnte durchgeführt werden
Vielen Dank an alle, auch aus so kleine Zahlenspielereien kann man einiges Lernen
Gruß Liene
Hallo,
Zitatauch aus so kleine Zahlenspielereien kann man einiges Lernen
Du hast nicht wirklich was gelernt. Jedenfalls nichts, was man in einer Datenbank brauchen könnte.
Warum willst unbedingt bei Deiner Version bleiben ?
Hallo,
ich beharre gar nicht auf meine Version.
Aber gelernt habe ich etwas wichtiges was mir bestimmt noch mal helfen wird.
Ich denke, das Einsetzen von Zeichenketten in einem SQL-Ausdruck ist schon wichtig.
Bei meinen Versuchen kam immer der Fehler "Datentypen in Kriterienausdruck unverträglich"
Bis ich mit der Forensuche dahinter bekommen bin:
Where Nachname = '" & strNachname & "'" für Zeichen, oder
WHERE Zahl=" & zz für Zahlen und
WHERE DatumA = " & Format(DatumFeld, "\#yyyy-mm-dd\#") für Datum
Für einen Anfänger ein ziemlicher Erkenntniszuwachs :-)
Zitat
Deine eigene Funktion kannst Du ersatzlos eindampfen.
Das tue ich sowieso, da das ganze für eine einmalige Diskussion zur Statistik über Erwartungswerte von Häufikeiten gemacht war
Nochmal Danke für dein Bemühen