Zufallszahlen erzeugt in Schleife zeigen ein Muster

    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!

    • Zufallszahlen erzeugt in Schleife zeigen ein Muster

      Hallo Bascom-Gemeinde,

      ich bin dabei, meinen 8x8x8 LED-Würfel zum Leben zu erwecken, stoße jedoch auf Probleme bei der Verwendung der Rnd()-Funktion.
      Die von mir benötigte Rnd(8)-Funktion liefert immer das gleiche, sich ständig wiederholende, Muster.
      Mein Problem ist nicht, dass nach jedem Neustart die gleiche Folge an Zahlen generiert wird. Dies lässt sich ja bekanntlich durch geschickte Veränderung von ___rseed ändern.
      Mein Problem ist, dass in dieser Do-Loop-Schleife

      BASCOM-Quellcode

      1. Do
      2. x = Rnd(8) 'x-Koordinate der zufällig zu bestimmenden LED
      3. y = Rnd(8)
      4. z = Rnd(8)
      5. Cube(y,z).x=1
      6. Waitms 25
      7. Cube(y,z).x=0
      8. Wait 1
      9. Loop
      10. ein fixes Muster von nur 8 Zahlen-Trippeln erzeugt wird, das sich danach ständig wiederholt. D.h. das 9. Zahlen-Trippel ist identisch mit dem 1., usw.
      11. Habe testweise folgenden Code im Simulator laufen lassen, der jeweils 100 Pseudo-Zufallszahlen für Rnd(1) bis Rnd(10) erzeugt:
      12. $regfile = "m128def.dat"
      13. $crystal = 16000000
      14. $hwstack = 64
      15. $swstack = 64
      16. $framesize = 64
      17. Dim W as Word
      18. Dim I as Byte
      19. Dim J as Byte
      20. For j= 1 to 10
      21. Print "Rnd(";j;"): ";
      22. For i=1 to 100
      23. w=Rnd(j)
      24. Print w;
      25. Next
      26. Print
      27. Next
      28. End
      Alles anzeigen

      Das Ergebnis der Simulation sieht so aus:
      Rnd(1): 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
      Rnd(2): 1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010
      Rnd(3): 1220020021002200202010000201001010000100211002122212000111200022100111021212221201220201200110212101
      Rnd(4): 3210321032103210321032103210321032103210321032103210321032103210321032103210321032103210321032103210
      Rnd(5): 0101220440301403242302300011333010414340101044143210043134333400322121124220220413221422203043101130
      Rnd(6): 3410501052525252105412101454341410321012303450121214145410341050321214305234143054525034543252543454
      Rnd(7): 3542631550226420602336055252120106060132422160356450141320515523543123344120054623305144500530454116
      Rnd(8): 7610325476103254761032547610325476103254761032547610325476103254761032547610325476103254761032547610
      Rnd(9): 0258030167822711804407104877475228026737524424015126256477480760346361823304571838747026413584755450
      Rnd(10): 9290347418509430301818181696363038165612529054365690983836525412301834745470765030167098149274309054

      Rnd(1): ist klar, macht keinen Sinn, da der Zahlenraum ja nur auf eine Zahl beschränkt ist.
      Rnd(2): nicht wirklich zufällig, da lediglich das Muster "10" ständig wiederholt wird. Es werden niemals aufeinanderfolgende Nullen oder Einsen erzeugt.
      Rnd(3): sieht recht zufällig aus, ich kann jedenfalls kein Muster erkennen :thumbup:
      Rnd(4): nicht wirklich zufällig, hier wird ständig das Muster "3210" wiederholt
      Rnd(8): ebenso nicht wirklich zufällig, hier wird ständig das Muster "76103254" wiederholt

      Hat jemand eine Idee, warum bei Rnd(2), Rnd(4) und Rnd(8) diese fixen Muster von jeweils 2,4 und 8 Zahlen generiert werden, aber bei allen anderen Argumenten nicht?
      Hmm, 2,4,8 . . . klingt irgendwie binär . . .

      Wie kann ich eine brauchbare Folge an Zufallszahlen zwischen 0 und 7 bekommen? ?(

      Besten Dank & Grüße
    • FunThomas schrieb:

      Wie kann ich eine brauchbare Folge an Zufallszahlen zwischen 0 und 7 bekommen?
      Viele nehmen dafür einen offenen ADC-Eingang und geben das "Rauschen" auf die __rseed Variable. Dadurch erhöht sich der "Zufall".

      Du kannst aber auch diese Zeile

      Rnd(9): 0258030167822711804407104877475228026737524424015126256477480760346361823304571838747026413584755450

      verwenden und einfach am Ende 1 abziehen.

      x = Rnd(9)
      x = x - 1
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Wirkliche Zufallszahlen gibt es nicht ohne Aufwand.

      Bei Bascom wird da immer die gleiche Liste ausgegeben wenn man keine Maßnahmen ergreift.

      Ich würde in einem Interupt das RSEED hochzählen und eventuell beim "drücken der Würfeltaste" nochmals mischen.
      Dann wird man schon eine gut gemischte Liste erhalten.
      Weil der Start des Würfels individuell erfolgt aber RSEED im Interupt gemischt wird.
      Man kann aber auch an einen ADC-Port einen Draht hängen (Antenne) und den Zufallsgenerator mit der Streuspannung die dann am Eingang anliegt mischen.
    • Danke für die schnellen Antworten:
      Meine Frage war jedoch eine andere.

      Mir geht es nicht darum wie man echte Zufallszahlen erzeugen kann. Das ist alles bestens bekannt. Auch die diesbezügliche Funktion von ___rseed ist mir geläufig (Taster/Timer-Abfrage nach Reset, oder jeweils neuen Startwert im EEPROM ablegen und beim nächsten Neustart rseed damit füttern, etc.

      Meine Frage war, warum beispielsweise RND(8) ein immer gleiches wiederkehrendes Muster erzeugt, RND(3) oder RND(7) jedoch nicht (s. meinen ersten post oben).

      Grüße