1 Bit-Zustand zufällig generieren

OP #2392172
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.
OP #2392242
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.
OP #2392266
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;
}
}
OP #2392587
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.
Gast #2392821
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren