Forum: Compiler & IDEs 1 Bit-Zustand zufällig generieren


von Samuel P. (mo3bius)


Lesenswert?

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.

von Floh (Gast)


Lesenswert?

Über srand kannste den Start der Folge mit einem Wert initialisieren, 
wie z.B. der Systemzeit. Wäre einen Versuch wert.
:-)

von Samuel P. (mo3bius)


Lesenswert?

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.

von Samuel P. (mo3bius)


Lesenswert?

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;
}
}

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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

von Samuel P. (mo3bius)


Lesenswert?

>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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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).

von tom (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.