Bau dir einen alternativen Zufallsgenerator. Für µC und Co. zum Beispiel
hab ich mal einen Roulette-Zufallsgenerator auf einem Shift-XOR-Register
aufgebaut :
;**************************************** WAIT TIMER
RANDOM: ; Zufallszahl beschreiben ( RANDOM )
cli
RANDOM_AGAIN:
ldi TEMP2,0
call RANDOM_BIT
lsl TEMP2
call RANDOM_BIT
lsl TEMP2
call RANDOM_BIT
lsl TEMP2
call RANDOM_BIT
lsl TEMP2
call RANDOM_BIT
lsl TEMP2
call RANDOM_BIT
cpi TEMP2,37
brsh RANDOM_AGAIN
mov RANDOM,TEMP2
sei
ret
RANDOM_BIT: ; erzeugt zufälliges Bit -> TEMP2.0
ldi ZH,0x35
ldi ZL,00
bclr 0
andi TEMP2,0b11111110; Result := 0
sbrc SR1,0
bset 0
brcc RB_ROLL
ori TEMP2,0b00000001; Result := 1
lpm TEMP1,Z+
eor SR1,TEMP1
lpm TEMP1,Z+
eor SR2,TEMP1
lpm TEMP1,Z+
eor SR3,TEMP1
lpm TEMP1,Z+
eor SR4,TEMP1
lpm TEMP1,Z+
eor SR5,TEMP1
lpm TEMP1,Z+
eor SR6,TEMP1
lpm TEMP1,Z+
eor SR7,TEMP1
lpm TEMP1,Z+
eor SR8,TEMP1
RB_ROLL:
ror SR8
ror SR7
ror SR6
ror SR5
ror SR4
ror SR3
ror SR2
ror SR1
ret
Auf der Addresse "0x3500" liegt ein Maskendwort :
.db 0b01010110,0b00000000 ; L,ML
.db 0b00000000,0b10000000 ; MH,H
.db 0b00100110,0b00000000 ; L,ML
.db 0b00000000,0b00001000 ; MH,H
Random_Bit erzeugt ein Zufallsbit, Random eine Zufallszahl. Als Ausgang
wird ein 64bit Register (SR1-8) verwendet, also recht unwahrscheinlich,
dass da viel Murks passiert. Als Startwert kannst du SR1-SR8 nach dem
Power-On des µCs mit Werten aus dem SRAM befüllen Diese sind dann
physikalisch schon absolut zufällig.
Diese Technik ist relativ schnell, speichersparend und ziemlich
Zufallssicher. Je kleiner das Register (SR1-8), desto schneller
arbeitet der Algo. Allerdings leidet der Zufall dann darunter. Für ein
32bit-Register einfach nur die ersten 4 Maskenbytes verwenden.