Was mit Preudozufall geht: Merke dir im EEPROM den letzten Zufallswert als seed für den nächstes Start-- ok, ist etwas stressig für's EEPROM.
'Richtige' Zufallswerte bekommst du folgendermassen:
Nach Power-On-Reset berechnest du einen Wert seed aus dem RAM-Inhalt. Dieser ist uninitialisiert und damit mehr oder weniger zufällig; zumindest für AVR-SRAM. Diesen Wert kannst du als Startwert für deine RND-Routine nutzen.
Ich poste hier mal einen C-Code, der mir nach jedem Einschalten einen anderen 16-Bit-Wert liefert. Habs eben mal abgecheckt![]()
Meine BASIC-Zeiten sind seit C64 vorbei, vielleicht ist jemand so nett und übersetzt nach BASIC?
Code:#define RAM_START 0x60 #define RAM_END (RAM_START + 0x400) // Deklariere eine 16-Bit Variable seed. // Lege sie in Section .noinit, damit sie vom Startupcode (crtm8.o) // nicht überpinselt wird. unsigned short seed __attribute__((section(".noinit"))); // Lege get_seed() in die Section .init0 // Diese wird direkt nach RESET-Interrupt aufgerufen, // noch vor dem Startup-Code und Aufruf von main(). __attribute__((section (".init0"))) __attribute__((naked)) void get_seed() { unsigned char *pram; unsigned short _seed = 0; for (pram = (unsigned short*) RAM_START; pram < (unsigned short*) RAM_END; pram++) _seed += *pram; // Oder sonst was... seed = _seed; } // !!! Wichtig: get_seed() NICHT aufrufen!!! void main() { ... ... = seed; ... }






Zitieren

Lesezeichen