Die zufällige Wahl eines Parameters bei verschiedener Häufigkeit

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Die zufällige Wahl eines Parameters bei verschiedener Häufigkeit

      Mir ist bei dem Titel des Themas nix g'scheit's eingefallen, klingt bisschen kryptisch :huh: . Folgendes: ich möchte per Zufallszahl einen Parameter aus einer Liste von möglichen auswählen. Die einzelnen Parameter sollen aber durchschnittlich verschieden oft gewählt werden und es soll nicht hintereinander der gleiche Parameter gewählt werden. Besser verständlich? Ein Beispiel: bei meiner letzten Uhr gibt es verschiedene Satzbaumöglichkeiten um die Uhrzeit mitzuteilen, insgesamt 5 verschiedene. Es wird mit einer Zufallszahl einer daraus gewählt, Satzbau_1 bis Satzbau_3 sollen aber doppelt so oft gewählt werden, wie Satzbau_4 und Satzbau_5. Es soll aber nicht hintereinander der gleiche Satzbau gewählt werden. Das hab' ich so gelöst

      BASCOM-Quellcode

      1. ...
      2. Do
      3. Satzauswahl = Rnd(8) 'hier wird gewürfelt, welche Satzauswahl als nächstes kommt, es soll von der vorherigen Wahl verschieden sein
      4. Loop Until Satzauswahl <> Letzte_wahl And Satzauswahl <> Letzte_wahl_1
      5. Letzte_wahl = Satzauswahl
      6. Letzte_wahl_1 = Letzte_wahl + 5
      7. ...
      8. Select Case Satzauswahl 'je nach Satzauswahl den Zeitsatz zusammenstellen
      9. Case 0 : Gosub Satzbau_1 'Satzbau 1..3 kommen häufiger dran
      10. Case 1 : Gosub Satzbau_2
      11. Case 2 : Gosub Satzbau_3
      12. Case 3 : Gosub Satzbau_4
      13. Case 4 : Gosub Satzbau_5
      14. Case 5 : Gosub Satzbau_1
      15. Case 6 : Gosub Satzbau_2
      16. Case 7 : Gosub Satzbau_3
      17. End Select
      Alles anzeigen
      Es wird eine Zahl zwischen 0 und 7 gewürfelt und mit case eben ein Satzbau gewählt. case 5, 6 und 7 führen zum gleichen Satzbau wie 0, 1 und 2. Haben also doppelte Chance. Um jetzt eine Wiederwahl zu verhindern, ist mir nur so ein komischen Konstrukt wie diese do..loop-Schleife eingefallen, die bei einer Wiederwahl einfach noch mal würfeln lässt. Das muss doch schöner gehen, vor allem wenn die Häufigkeit deutlich unterschiedlicher sein soll. Das Beispiel oben wird alle Minute ausgeführt, in der Variablen 'Letzte_Wahl' ist also die Auswahl von vor einer Minute
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Das mit dem Verhindern des Wiederholens des letzten Textes läßt sich wohl nur so machen, wie Du es beschreibst.
      Bezüglich der Verteilung kannst Du Zufallszahlen bis zum Beispiel 100 erzeugen und dann in der CASE-Abfrage jeweils eine Range abfragen. Case 1 bis 20 wäre dann zum Beispiel eine 20%ige Wahrscheinlichkeit. Case 21 bis 60 wäre eine 40%ige Wahrscheinlichkeit etc. So verteilst Du Deine Möglichkeiten auf die 1 bis 100.
    • Wenn ich eine range angebe, wird das Verhindern der Wiederholung schon sehr unübersichtlich, wenn man dafür kein anderes Verfahren findet.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Würfeln, mit case range eine Variable setzen, die mit der vorherigen vergleichen, bei Gleichheit neu würfeln. Wenn verschieden mit dieser Variablen und neuem case dann die gosubs ausführen.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Als Idee:
      An einigen Stellen habe ich oft gelesen, dass Zufallszahlen mit einem offenen ADC Eingang zuverlässige generiert werden können.
      Sprich, Eingang offen lassen, dass möglichst viele Störeinflüssen einstreuen, Messwert wandeln und dann entsprechend verrechnen.
      Habs allerdings selbst noch nicht gemacht...
    • @Duesentrieb72 die Erzeugung einer Zufallszahl ist hier jetzt nicht das Thema. Mir genügt die 'pseudo' Zufallszahl von Rnd(). Ich verdeutliche mal mein Problem. Bei meinem 'Zug der Zeit' oder meinen 'Zeitbrettern' wird die Uhrzeit als Satz ausgegeben.
      Satzbau_1 erzeugt sowas: "es ist acht Minuten nach sieben"
      Satzbau_2 erzeugt sowas: "kurz nach sieben nach sieben"
      Satzbau_3 erzeugt sowas: "sieben Uhr acht"
      Satzbau_4 erzeugt sowas: "es ist vormittag'
      Satzbau_5 erzeugt sowas: "es ist 25 vor 33 nach sieben"
      Die Auswahl des Satzbaus soll von Minute zu Minute eben zufällig unterschiedlich sein und auch hintereinander unterschiedlich. Da aber Satzbau_4 und _5 einmal recht grob, zum anderen, naja, mühsam, ist, sollen die durchschnittlich seltener gewählt werden. Mein code-Vorschlag oben macht das, Satzbau_1.._3 wird durchschnittlich doppelt so oft gewählt, wie Satzbau_4, _5.
      Wenn man aber jetzt eine größere Wahrscheinlichkeit haben möchte, wird das Verhindern von zufällig gleicher Wahl hintereinander (durch die do..loop until) mit meinem ursprünglichen code mühsam. Daher die Frage an das Forum, wie man das (jetzt mehr theoretisch) eleganter machen könnte.

      Der 'universellere' code, wie im post#5 beschrieben wäre jetzt so

      BASCOM-Quellcode

      1. ...
      2. Do
      3. Wahl = Rnd(8) 'hier wird gewürfelt, welche Satzauswahl als nächstes kommt
      4. Select Case Wahl
      5. Case 0 To 1 : Satzauswahl = 0
      6. Case 2 To 3 : Satzauswahl = 1
      7. Case 4 To 5 : Satzauswahl = 2
      8. Case 6 : Satzauswahl = 3
      9. Case 7 : Satzauswahl = 4
      10. End Select
      11. Loop Until Satzauswahl <> Letzte_wahl 'nicht 2x hintereinander dieselbe Wahl
      12. Letzte_wahl = Satzauswahl
      13. ...
      14. Select Case Satzauswahl 'je nach Satzauswahl den Zeitsatz zusammenstellen
      15. Case 0 : Gosub Satzbau_1 'Satzbau 1..3 kommen häufiger dran
      16. Case 1 : Gosub Satzbau_2
      17. Case 2 : Gosub Satzbau_3
      18. Case 3 : Gosub Satzbau_4
      19. Case 4 : Gosub Satzbau_5
      20. End Select
      21. ...
      Alles anzeigen
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von tschoeatsch ()