mit diesen aussagen kann ich irgendwie nix anfangen
mit diesen aussagen kann ich irgendwie nix anfangen
Das ist dein Zufallszahlengeneratur.Code:#include <stdint.h> // interner Zustand static uint32_t x = 123456789; // <- beliebige seed != 0 static uint32_t y = 362436000; static uint32_t z = 521288629; static uint32_t c = 7654321; uint32_t KISS() { uint64_t t; // Linearer Kongruenzgenerator x = 69069 * x + 12345; // Xorshift y ^= y << 13; y ^= y >> 17; y ^= y << 5; // Multiply-with-carry t = 698769069ULL * z + c; c = t >> 32; z = (uint32_t) t; return x + y + z; }
static uint32_t x = 123456789; // <- beliebige seed != 0
Das ist dein seed. Der "Samen" des Zufalls. Ist dieser Wert immer gleich, kommt immer dieselbe Reihe an Zahlen raus. Ergo, addiere einfach eine Zeit aus einem Timer beim Start des Spieles drauf... aber nur einmalig.
Der Pseudozufallsgenerator von schorsch_76 wäre eine Möglichkeit.
Eine andere Möglichkeit wäre so etwas wie ein echter "Zufall", etwa über die Zeitmessung, etwa für die Zeit wann die Taste zum würfeln gedrückt wird. Je nach µC geht das sehr einfach: wenn der µC einen Timer mit Capture funktion hat, kann man den Timer direkt und schnell bis 5 Zählen lassen, und die Capture funktion scharf stellen. Bei jeder Flanke bekommt man dann einen Quasi zufälligen Wert von 0-5 im Capture Register - nach jeder Taste hat man da also einen neuen Wert.
Durch das Zählen nur bis 5 spart man sich die ggf. etwas trickreiche Umrechung in den Bereich 1-6.
Es ist ja nicht das erste Mal, das ein random number generator in C gebraucht wird: da hilft dann, wie in C üblich, die man-page. Um die ganze Sache nicht zu langweilig zu machen, sollte man den seed mit etwas Zufall versehen: die Zeit bis zum ersten Tastendruck, einen offenen ADC Eingang oder so.
MfG Klebwax
Strom fließt auch durch krumme Drähte !
Wenn man es aufwändiger will kann man auch einen Chaosgenerator nutzen. Den Ausgang des Chaosgenerators verbindet man mit dem Analogeingang des Controllers.
MfG Hannes
Lesezeichen