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