Hi, ich habe 2 Zustände und möchte zufällig einen dieser beiden auswählen. Hierfür habe ich in etwa folgendes programmiert: include <stdlib.h> if(rand()%2 = 0) { // state 1; } else { state 2; } Anscheinend verwendet aber rand() keinen zufälligen seed. So wird beim ersten Aufruf immer der erste Zustand ausgewählt. Habt ihr einen besseren Vorschlag? P.S: Bitte keine Grundsatzdiskussion was zufällig ist, meine Anforderungen sind gering.
Über srand kannste den Start der Folge mit einem Wert initialisieren, wie z.B. der Systemzeit. Wäre einen Versuch wert. :-)
Ja, aber ein Atmega32 besitzt keine Systemzeit. Trotzdem hat mir das was geholfen. Ich könnte ja einen Timer starten. Wenn ich meine Funktion aufrufe, nutze ich das erste mal den Timer als seed: include <stdlib.h> unsigned int time = 0; unsigned int seed_set = 0; TCCR0 = (1<<CS01); if(seed_set == 0) { srand(TCNT0); seed_set = 1; } if(rand()%2 = 0) { // state 1; } else { state 2; } Ich bin mir nur unsicher ob der Seed gut gewählt ist. Er hat bei einen 8Bit Timer ja nur 256 Werte. srand() erwartet aber ein unsigned int.
Habs mir nochmal überlegt, es geht eigentlich viel einfacher. Ich warte auf das Drücken eines Buttons. Kombiniere ich das mit dem Timer, so ist dies wohl die beste Lösung: include <stdlib.h> TCCR0 = (1<<CS01); if(Button == 1) { if(TCNT0%2 == 0) { // state 1; } else { state 2; } }
Vor dem Drücken des Knöpfchens gibt's aber immer den gleichen Wert. Ein möglicher Ausweg: http://www.rn-wissen.de/index.php/Zufallszahlen_mit_avr-gcc
>Vor dem Drücken des Knöpfchens gibt's aber immer den gleichen Wert. Das stimmt so nicht. Mit >TCCR0 = (1<<CS01); wird der Timer aktiviert. Dieser läuft von 0 bis 255 und startet von vorne (usw.). Sobald ich auf den Knopf drücke lese ich den Wert aus. Ist dieser gerade wird Ereignis 1 getriggert, ansonsten 2. Da der Timer sehr viel schneller seine Werte ändert als man drücken kann, sind diese Werte sogar praktisch nicht mehr deterministisch.
Ok, oben stand nicht, daß die Zufallszahl nur nach einem Tastendruck benötigt wird. Wäre ja möglich, daß es ist wie bei einem Spiel: Wenn der Spieler vor dem Erzeugen des Spielfeldes keine Taste drückt, wird das Spielfeld immer göeich aufgebaut (z.B. Labyrinth oder zufällig verteilte Gummipunkte).
eine pfiffige lösung für 1-2 bit random zahl wäre einen offenen adc-eingang zu benutzen und das/die LSB zu nehmen. je nach temperatur und "kosmischer" strahlung usw. ist das ein guter hw-basierter random generator und simple noch dazu. gruss, tom.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.