Doch ein Zufall

    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!

    • Doch ein Zufall

      Hallo zusammen!
      Ich benötige einen Zufallsgenerator. Nicht so einen, der immer das selbe Ergebnis hat. Nun bin ich auf eine seltsame Lösung gestoßen. Bei einem ATtiny44 habe ich PORTA.0 als Anlog-Input definiert. Nun würde man ja normalerweise da z.B. ein Potentiometer anschließen und den Wert des Spannungsteilers abfragen. Ich habe den Port aber einfach in der Luft hängen lassen. Dadurch scheint da ein gewisses Spannungs-Rauschen anzuliegen. Zur Verstärkung des Rauschens habe ich ein Stück Draht mit offenem Ende angeschlossen. Nun frage ich den Wert des ADC ab und lasse mir via MOD den gewünschten Zufalls-Bereichs ausgeben. Das scheint mir - natürlich mit einer gewissen Tolleranz - ein vernünftiges Ergebnis zu sein. Ohne "Antenne" funktioniert das auch, aber das Ergebnis ist etwas schlechter.

      Ich gehe davon aus, dass dieses Verfahren nur für relativ kleine Zufalls-Bereiche anwendbar ist. Aber meist wird ja nur eine Entscheidung zwischen Ja und Nein oder 0-6 (Würfeln) oder wie bei mir zwischen 0 und 7 zur Lichtsteuerung bei einer Modelleisenbahn gesucht.

      Zum testen bitte die Konstanten Vergl und Bereich anpassen.

      Quellcode

      1. $regfile "attiny44.dat"
      2. ' '
      3. $crystal = 1000000
      4. $swstack = 50
      5. $hwstack = 50
      6. $framesize = 50
      7. Config Porta = Output
      8. Config Porta.0 = Input
      9. Config Adc = Single , Prescaler = Auto , Reference = Avcc
      10. Const Vergl = 310
      11. Const Bereich = 3
      12. Dim Zufall As Word
      13. Dim Eins As Word
      14. Dim Zwei As Word
      15. Dim Drei As Word
      16. Dim Vier As Word
      17. Dim Fuenf As Word
      18. Dim N As Word
      19. Do
      20. For N = 1 To 1000
      21. Zufall = Getadc(0)
      22. Zufall = Zufall Mod Bereich
      23. If Zufall = 0 Then Incr Eins
      24. If Zufall = 1 Then Incr Zwei
      25. If Zufall = 2 Then Incr Drei
      26. If Zufall = 3 Then Incr Vier
      27. If Zufall = 4 Then Incr Fuenf
      28. Next
      29. If Eins > Vergl Then Porta.1 = 1
      30. If Zwei > Vergl Then Porta.2 = 1
      31. If Drei > Vergl Then Porta.3 = 1
      32. If Vier > Vergl Then Porta.4 = 1
      33. If Fuenf > Vergl Then Porta.5 = 1
      34. Waitms 500
      35. Porta.1 = 0
      36. Porta.2 = 0
      37. Porta.3 = 0
      38. Porta.4 = 0
      39. Porta.5 = 0
      40. Waitms 500
      41. Eins = 0
      42. Zwei = 0
      43. Drei = 0
      44. Vier = 0
      45. Fuenf = 0
      46. Loop
      Alles anzeigen
    • Hi, ich verstehe dein Programm nicht.
      Zufall ist das Ergebnis des adwandlers. Mod Bereich ist bei mir jetzt mod 3, da können als Ergebnis doch nur Werte von 0 bis 2 raus kommen. Ist das jetzt nur für einen Versuch so eingestellt Bereich=3?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Hi,
      ja genau so ist es. Ich suchte ja nur zwei Werte. Zum einen zwischen 0-7 um zufällig eine von acht Lampen zu schalten. Und zum anderen einen Wert zwischen 0 und 1 um die gewählte Lampe aus- oder einzuschalten. Die Funktion RND gibt mir da immer wieder die gleiche Abfolge aus. Das ist dann nicht wirklich zufällig.

      Im Beispiel lese ich den Wert am Analog-Input und bilde mir mit MOD daraus den gewünschten Bereich. Da - so vermute ich - am Analog-Input immer wieder ein anderer Wert anliegt, bekomme ich ein zufälliges Ergebnis. Im Beispiel zwischen 0 und 2. Dieses Ergebnis zähle ich. Nach 1000 Durchläufen vergleiche ich die Treffer. Läge eine statisch genaue Verteilung vor, so müssten zwei Zähler 333 und einer 334 aufweisen. In der Praxis gibt es diese genaue Verteilung natürlich nicht. Daher der etwas niedrigere Vergleichswert. Im Beispiel 310. Meine Interpration der Testroutine lautet: Wenn nahezu immer alle Werte oberhalb des Vergleichswertes liegen, dann habe ich eine hinreichend zufällige Verteilung erreicht.

      In meiner Versuchanordnung kann man natürlich auch andere Bereiche prüfen. Z.B. mit einem Vergleichwert von 175 und dem Breichswert von 5. Bei regelmäßiger Verteilung soll rechnerisch für jede Zahl von 0-4 jeweils 200 Treffer vorliegen. Oder für eine ja/nein-Entscheidung der Vergleichswert von 480 und der Bereichswert 2.
    • Was möchtest du uns mit deinem „Erkenntnis“ vermitteln.
      Ein Grossteil der Leser wird es bekannt sein, dass ein hochohmiger Eingang und erstrecht ein AC jeden „Mist“ aus der Umgebung einfangen kann. Sehr oft auch bis hin zum Eigentod(mit Antenne schon ein paar 1000 Volt möglich)

      Spaß beiseite.
      Hast du dich schon mal den RND- Befehl angeschaut.
      Kannst Zufallzahl von 2^1 bis 2^32 einstellen. Na ja bei 32 musst du schon sehr viel Glück haben die Zahl zweimal hintereinander zu bekommen.
      Nachtrag:
      Nun könnte ein Hinweis kommen „laut Datenblatt haben die ADC- Eingänge eine Schutzdiode“. Ist richtig aber wann knallen diese bei einer gewollten statischen Entladung durch.
      Meine Bitte vergewaltige den µC nicht. Software ist eine andere Sache.
      Gruß

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von fredred () aus folgendem Grund: Nachtrag.

    • Fredred,
      ohne "Mischen" des Zufallsgenerators wirst du immer die gleiche Folge von Zahlen haben nach Programmstart.
      Probiere es aus...

      Der Gedanke von HRi ist schon richtig.
      Hat man keine Echtzeituhr oder Netzwerk am Rechner zur Verfügung, muss man kreativ werden einen zufälligen Wert zum Mischen zu bekommen.

      Auszug aus der Hilfe zu RND:

      Quellcode

      1. Notice that it is a software based generated number. And each time you will restart your program the same sequence will be created.
      2. You can use a different SEED value by dimensioning and assigning ___RSEED yourself:
      3. Dim ___rseed as word : ___rseed = 10234
      4. Dim I as word : I = rnd(10)
      5. When your application uses a timer you can assign ___RSEED with the timer value. This will give a better random number.
      Alles anzeigen
      Über ___rseed kann mal also "Mischen" um nicht die gleiche Abfolge an Zufallszahlen zu bekommen.
      Einen zufälligen Wert vom ADC dafür zu nehmen, ist eine Möglichkeit. (Früher hat man Germaniumdioden dafür genommen, weil die einen hohen Rauschfaktor haben)


      Gruß, Michael
      Code first, think later - Natural programmer :D
    • fredred schrieb:

      six1 schrieb:

      Hat man keine Echtzeituhr oder Netzwerk am Rechner zur Verfügung, muss man kreativ werden einen zufälligen Wert zum Mischen zu bekommen.
      Gut. Ist aber möglich in einer Do ein dynamischen Timer zu starten der den RND startet.
      Was ist das? Dynamischer timer? Wo kriegst du eine Dynamik her? Dynamo hätt' ich noch im Keller einen.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • @HRi
      Wenn du schon einen Pin opferst, kannst du auch einen Taster anbauen. Wenn der betätigt wird,
      liest du die Werte aus TIME$ aus. Die kannst du dann als Startwert für __RSEED nehmen.
      Die Wahrscheinlichkeit, den Taster immer zur gleichen Zeit zu drücken, ist doch sehr gering.
      a_48_7237538e und Fredred muss keine Angst vor einem Gewitter haben. a_48_7237538e

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • Ist jetzt eine Änderung von _rseed das gleiche wie eine Zeitlang rnd()s zu erzeugen (warten auf tastendruck)?
      Also ich hab' beim Programmstart einfach eine Schleife, in der dummy=rnd(100) ausgeführt wird, bis eine Taste gedrückt wird, dann geht's weiter im Programm.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • HRi schrieb:

      Entscheidend für den Zufall ist ja, dass am Port immer wieder ein anderer Wert anliegt.
      klar, aber an deinem Port liegen in dem Fall offen nicht alle möglichen Werte an, sondern eher einer Gaußkurve ähnlich im Bereich von 0-2V (nur Beispiel)
      Dadurch bekommst du die gleiche RND-Verteilung wie beim anliegenden E-Smog.
      Du willst aber einen festen Bereich von 0-7 und nicht eine besondere Häufigkeit bei 2-4 ;)
      Deswegen ist es sinnvoll, den Wert zu seeden, wie hero schreibt.
    • fredred schrieb:

      tschoeatsch schrieb:

      Was ist das? Dynamischer timer? Wo kriegst du eine Dynamik her? Dynamo hätt' ich noch im Keller einen.
      Ein Incr der an einen beliebigen Punkt neu gestartet werden kann(SET/RESET).Bitte, bitte und nochmals Bitte,für die saudumme Wortwahl.

      Dekaman schrieb:

      und Fredred muss keine Angst vor einem Gewitter haben.
      Habe ich aber...
      Ja und wo kommt der beliebige Punkt her? Es geht doch hier in erster Linie darum, das nach einem Programmstart ohne ein Zutun eines Bedieners Zufallszahlen erzeugt werden, die von Start zu Start unterschiedlich sind, wie das mit rnd() wohl nicht ist.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • fredred schrieb:

      Was möchtest du uns mit deinem „Erkenntnis“ vermitteln.
      Ein Grossteil der Leser wird es bekannt sein, dass ein hochohmiger Eingang und erstrecht ein AC jeden „Mist“ aus der Umgebung einfangen kann. Sehr oft auch bis hin zum Eigentod(mit Antenne schon ein paar 1000 Volt möglich)

      Spaß beiseite.
      Hast du dich schon mal den RND- Befehl angeschaut.
      Kannst Zufallzahl von 2^1 bis 2^32 einstellen. Na ja bei 32 musst du schon sehr viel Glück haben die Zahl zweimal hintereinander zu bekommen.
      Nachtrag:
      Nun könnte ein Hinweis kommen „laut Datenblatt haben die ADC- Eingänge eine Schutzdiode“. Ist richtig aber wann knallen diese bei einer gewollten statischen Entladung durch.
      Meine Bitte vergewaltige den µC nicht. Software ist eine andere Sache.
      Gruß
      Ja natürlich habe ich auch schon mal mit RND versucht. Der beginnt nach dem Start aber immer mit dem selben Wert und erzeugt auch ein regelmäßiges Muster. Genau das will ich nicht haben.
    • Dann würde ich einen timer laufen lassen, der durch den LDR (Lichtsensor) gestoppt wird. Der Stand vom timer als _rseed verwenden. Ich glaube nicht (mir noch nicht aufgefallen) das rnd() Muster erzeugt, die sich in rel. kurzer Zeit wiederholen. Vom Start weg, geht's immer gleich los, ja.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch schrieb:

      das nach einem Programmstart ohne ein Zutun eines Bedieners Zufallszahlen erzeugt werden, die von Start zu Start unterschiedlich sind, wie das mit rnd() wohl nicht ist.
      Nach meinem Dafürhalten läuft im µC alles nach festen Regeln ab. Angetrieben durch den Systemtakt.
      Da passiert nichts zufällig. Da sitzt keiner drin und würfelt. Will sagen, wenn Zufall sein soll, muss man
      schon selber Hand anlegen. Sei's nun mit Taster, Rauschgenerator , Uhrzeit ,oder,oder .....

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • HRi schrieb:

      Das ganze soll starten, wenn es Nacht (=dunkel) wird. Und dann soll nicht immer das gleiche laufen.
      Dann eben keinen Taster, ersetze den Taster doch durch dein "dunkel".
      Wenn du dann zb. Time$ nimmst ,und damit den Start von RND bestimmst, hast du doch
      deinen Zufall, und brauchst nicht selber Hand anlegen.

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • tschoeatsch schrieb:

      Ja und wo kommt der beliebige Punkt her? Es geht doch hier in erster Linie darum, das nach einem Programmstart ohne ein Zutun eines Bedieners Zufallszahlen erzeugt werden, die von Start zu Start unterschiedlich sind, wie das mit rnd() wohl nicht ist.

      Nein nach meiner Meinung ist die HW wohl der falsche Ansatz, wenn erlaubt.
      Startest du egal was für ein Programm, gibt es immer ein Startmoment(hoffe „Moment“ ist verständlich). Nun wollte ich vermitteln, dass der „Start“ kein Dynamo ist, sondern die „Startenergie“ vorgegeben werden kann/muss.
      So nun will ich nicht mehr über Mechanik diskutieren.

      Dekaman schrieb:

      Dann eben keinen Taster, ersetze den Taster doch durch dein "dunkel".
      Wenn du dann zb. Time$ nimmst ,und damit den Start von RND bestimmst, hast du doch
      deinen Zufall, und brauchst nicht selber Hand anlegen.
      Ja damit könnte ich mich auch anfreunden.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von fredred ()