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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.