Forum: FPGA, VHDL & Co. 4, bzw. 16 verschiedene Zufallszahlen


von Thomas G. (thomas112)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

ich bräuchte für ein Memory-Spiel vorerst einemal 4 verschiedene 
Zufallswerte. Dazu hätte ich den angehängten Code verwendet.

Das Problem ist, das er mir die Werte teilweise trotzdem doppelt 
ausgibt, obwohl sie ja in der if-Anweisung eigentlich ausgeschlossen 
werden sollten.
Das ganze wird auf einem Xilinx Nexys 4 Board ausgeführt.

Ich hab nun schon ewig rumprobiert, aber ich finde einfach den Fehler 
nicht. Ich hab auch schon while-Anweisungen verwendet, aber dann schafft 
er die Bedingung innerhalb 2000 Versuchen nicht und bricht ab. Das ganze 
soll später dann eventuell noch auf 16 verschiedene Werte erhöht werden.

Die Ausgabe an die LEDs ist hier nur, damit ich seh, welche Werte 
generiert werden.

von Achim S. (Gast)


Lesenswert?

dann solltest du zuerst versuchen zu verstehen, was eine 
Hardwarebeschreibung von einer Programmiersprache unterscheidet.

Beispiel: in einer Programmiersprache (z.B. in C) würde folgendes 
Konstrukt
1
for b in 1 to 4 loop
2
if ((zaehlwertIV=zaehlwertII) or (zaehlwertIII=zaehlwertII) or (zaehlwertI=zaehlwertII))
3
   then
4
       zaehlwertII(0) <= zaehlwertII(2);
5
       zaehlwertII(1) <= zaehlwertII(3);
6
      zaehlwertII(2) <= zaehlwertII(0);
7
      zaehlwertII(3) <= zaehlwertII(1);
8
   end if;
9
end loop;

bewirken, dass die Inhalte von Zählwert 4 mal durchpermutiert werden.

In VHDL ist die for-Loop etwas völlig anderes: du teilst deinem 
Synthesetool durch diese for-loop 4 mal dassselbe mit: dass die Inhalte 
von zaehlwert genau ein mal neu zugewiesen werden. Ob du es ihm 4 mal 
mitteilst oder einmal oder 100 mal ist völlig egal: die Synthese macht 
daraus genau eine Neuzuweisung der Inhalte von zaehlwert (die 
for-Schleife ist also hier ohne Wirkung und führt nur Leute in die Irre, 
die VHDL mit einer Programmiersprache verwechseln ;-)

von VHDL hotline (Gast)


Lesenswert?

Thomas G. schrieb:
> Die Ausgabe an die LEDs ist hier nur, damit ich seh, welche Werte
> generiert werden.

Das solltest du besser in einer Simulation sehen.

von Achim S (Gast)


Lesenswert?

Hallo Achim S
danke für dein Beitrag als Gast
Wusste garnicht das ich mehrmals im Netz vorkomme
Achim S

von Thomas G. (thomas112)


Lesenswert?

Okay, ich hatte sie vorher nicht drinnen, hat dann eben nicht 
funktioniert, drum dachte ich, dass es mit einer for-Schleife 
funktionieren könnte..

Aber auf jeden Fall danke für deinen Hinweis, weil genau damit hab ich 
noch Probleme, dass ich wahrscheinlich zu sehr Programmiersprachenlastig 
denke..

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Das hier ist mehrfach kritisch:
1
  if (btnC = '0') then
1. Tasterprellen (unschön)
http://www.lothar-miller.de/s9y/categories/18-Flankenerkennung
http://www.lothar-miller.de/s9y/categories/5-Entprellung

2. nicht synchronisierter Eingang in einer FSM (extrem böse)
http://www.lothar-miller.de/s9y/archives/64-State-Machine-mit-asynchronem-Eingang.html


Achim S. schrieb:
> die for-Schleife ist also hier ohne Wirkung und führt nur Leute in die
> Irre, die VHDL mit einer Programmiersprache verwechseln
Wenn VHDL eine Programmiersprache wäre, würde es VHPL heißen...

Thomas G. schrieb:
> dass ich wahrscheinlich zu sehr Programmiersprachenlastig denke..
Du musst dir eine Schaltung "vorstellen" und die dann mit der 
Beschreibungssprache "beschreiben". So funktionieren VHDL und Verilog. 
Und hinterher im RTL-Schaltplan kontrollieren, ob der Synthesizer 
"deine" Schaltung aus der Beschreibung gemacht hat...

BTW: häng das nächste Mal eine *.vhd oder *.vhdl Datei an. Es wird dir 
mit bunt markierten Code gedankt werden...

: Bearbeitet durch Moderator
von Achim S. (Gast)


Lesenswert?

Thomas G. schrieb:
> weil genau damit hab ich
> noch Probleme, dass ich wahrscheinlich zu sehr Programmiersprachenlastig
> denke..

das Problem haben (anfangs) nicht wenige. Den einfacheren Einstieg in 
die Hardwarebeschreibung hat man wahrscheinlich, wenn man keine 
Programmiersprache kennt und gewohnt ist, Probleme mit digitaler 
Hardware zu lösen (also mit Multiplexern, Logikgattern, Flipflops, ...). 
Dann muss man "nur noch lernen", wie diese Hardwarekomponenten in VHDL 
beschrieben werden und vermeidet die Fallstricke, die Fallen, die sich 
ergeben, weil VHLD einer normalen Programmiersprache so ähnlich sieht.

Ein guter Einstieg in diese Syntheseorientierte Denke ist das Buch von 
Reichardt/Schwarz (VHDL-Synthese). Und auf Lothars Seite findest du sehr 
viele Beispiele, wie man Problemstellungen mit VHDL geschickt angeht, 
und welche beliebten Fehler man unbedingt vermeiden sollte. Wenn ich 
mich richtig entsinne hatte er darauf auch eine Empfehlungsliste für 
Anfänger (keine Variablen verweden sondern nur Signale, nur synchrone 
Designs bauen, nur einen Takt verwenden, Eingänge einsynchronisieren, 
....) Wenn du dich an die Liste hältst vermeidest du wahrscheinlich >95% 
aller Fehler, die dir ansonsten den Einstieg schwer machen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Achim S. schrieb:
> Wenn ich mich richtig entsinne hatte er darauf auch eine
> Empfehlungsliste für Anfänger
Ach, du meinst meine "Postulate". Ich traue mich nicht mehr, sie laufend 
zu wiederholen...  ;-)

Einfach mal die Suche anklicken:
https://www.mikrocontroller.net/search?query=postulate&forums[]=9&max_age=-&sort_by_date=1

: Bearbeitet durch Moderator
von FPGA-Ingenieur (Gast)


Lesenswert?


von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?


von Schlumpf (Gast)


Lesenswert?

Beschreibe doch mal, was dein Design machen soll.

Da findet sich bestimmt ein grundlegend besserer Ansatz.

Irgendwas soll mit einem Tastendruck passieren... aber was?

von Thomas G. (thomas112)


Lesenswert?

Vielen dank erstmal an alle für die Antworten.

Die for-Schleife ist auch schon wieder aus dem Code verschwunden;)


Das Programm soll folgendes machen:

Sobald ich die Taste btnC drücke, soll mir das Programm die Zahlen 
"durchzählen" und sobald ich von der Taste runtergehe, sollen dann 4 
VERSCHIEDENE Zufallszahlen übrig bleiben. Dadurch, dass ich ja bei 
100Mhz eigentlich nie gleich viel Impulse von der Clock bekomme, ist es 
ja quasi mehr oder weniger zufällig.

Also ich habe es vorher in einem anderen Code ausprobiert (ohne 
for-Schleife :P) und da ging es halt z.B. dann mit einem 
16er-Bit-Vektor, dass ich eben einmal beim 12. oder beim 4. usw.. Bit 
stehen geblieben ist. Also da Tat das Programm genau das, was ich 
wollte.

Also das Problem ist eben nicht eine einzelne Zufallszahl zu erzeugen. 
Sondern: die Zahlen werden zwar "durchgwürfelt", aber ich erhalte trotz 
der if-Bedingungen teilweise 2 oder 3 gleiche Zahlen. Was eben nicht 
sein sollte.



Liegt das nun wirklich an den nicht entprellten Tasten und dem nicht 
synchronisierten Eingang, oder liegt der Fehler irgendwo bei den 
if-Bedingungen?
Oder hat jemand konkret ganz andere Lösungsansätze?

von Berater (Gast)


Lesenswert?

1. Schaltung mit entprelltem Taster, die ein enable macht
2. Zähler, der bei Tastendruck rennt
3. Eine Pipeline aus 4 Registerwerten mit einem eigenen enable
4. Schaltung, die bei wegehendem enable1 diesen Zähler in die pipe 
schiebt

Wenn die Zufallszahlen verschieden sein sollen, musst Du sortieren.

von Schlumpf (Gast)


Lesenswert?

EINE Zufallszahl per Tastendruck zu erzeugen ist sehr einfach:

Man benötigt einen Zähler, der zählt, wenn die Taste gedrückt ist und 
stoppt, wenn man die Taste loslässt.

Da der Mensch nicht auf 10ns genau reproduzierbar drücken und loslassen 
kann, ist das auf jeden Fall zufällig.

Entprellt werden muss dazu der Taster nicht.
Ist doch völlig schnurz, ob der Zähler nach dem Loslassen noch zwei oder 
dreimal um ein paar Schritte weiter zählt und dann stehen bleibt.

Aber SYNCHRONISIERT werden sollte der Taster schon.


Für 4 Zufallszahlen, die dann auch noch untereinander zufällig sein 
sollen, wird das ganze komplizierter.

Man könnte vier Zähler nehmen.
Laufen die mit gleichem Takt, sind die Zahlen untereinander immer gleich
Laufen sie mit unterschiedlichem Takt, wiederholt es sich auch 
irgendwann.
Du hast aber nur ein unabhängiges Ereignis (Tastendruck), möchtest aber 
vier unabhängige Zufallszahlen erhalten. Das wird meines Erachtens nicht 
ganz einfach...

Du könntest mit vier Tastern arbeiten (Willst du aber vermutlich nicht).
Oder mit einem Taster hintereinander die vier Zahlen "erzeugen" (Willst 
du aber vermutlich auch nicht)

Der "Zufall" entsteht durch die Kombination aus Takt und Dauer des 
Tastendrucks.
Da aber deine Zähler alle von dem selben Takt (oder einem davon 
abgeleiteten) versorgt werden und alle Zähler mit der selben 
Tastendruckdauer "bedient" werden, sehe ich auf den ersten Blick nicht, 
wie da vier wirklich unabhängige Zufallszahlen rauskommen sollen.

Vielleicht hat da aber jemand eine clevere Idee.

Aber ich habe eh den Eindruck, dass du noch grundlegende 
Verständnisprobleme von HDL an sich hast.
Oder weißt du, wie man einen Zähler in HDL beschreibt?

von Markus F. (mfro)


Lesenswert?

wie oben schon erwähnt, "LFSR" heißt das Zauberwort. Für so ein 
Memory-Spiel müssen's ja nicht unbedingt "echte" Zufallszahlen sein.

Ein simples, linear rückgekoppeltes XOR-Schieberegister dürfte 
ausreichen.
1
ARCHITECTURE rtl OF test IS
2
    SIGNAL clk      : std_logic := '0';
3
    SIGNAL lfsr     : std_logic_vector(15 DOWNTO 0) := 16d"11";
4
BEGIN
5
    p_random : PROCESS
6
    BEGIN
7
        WAIT UNTIL rising_edge(clk);
8
        
9
        lfsr <= (lfsr(0) xor lfsr(1)) & lfsr(15 DOWNTO 1);
10
    END PROCESS p_random;  
11
END rtl;

lfsr wird einmal mit dem Seed initialisiert (der kommt aus dem 
Tastendruck), kann jeder beliebige Wert außer 0 (sonst springt die Sache 
nicht an) sein. Nach 4 clocks hat man vier "Zufallszahlen", die zwar 
nicht wirklich zufällig, dafür aber garantiert unterschiedlich sind.

von Schlumpf (Gast)


Lesenswert?

Guter Ansatz!

Der Seed kommt aus der Dauer des Tastendrucks und nach Loslassen der 
Taste spendiert man vier Takte und schubst den Seed durch das LFSR..
Das müsste "zufällig" genug sein..

von P. K. (pek)


Lesenswert?

Markus F. schrieb:
> aber garantiert unterschiedlich sind

Aber aufpassen: Das gilt nur, wenn du alle 16 Bit gleichzeitig 
betrachtest. Wenn Du jetzt aber ein 4-Bit-Subset daraus verwendest, kann 
es durchaus sein, dass sich da was wiederholt innerhalb der 4 Worte.

von Wolfgang R. (Firma: www.wolfgangrobel.de) (mikemcbike)


Lesenswert?


von FPGA-Ingenieur (Gast)


Lesenswert?

Markus F. schrieb:
> die zwar
> nicht wirklich zufällig, dafür aber garantiert unterschiedlich sind

... die sind dann aber immer in derselben Reihenfolge, oder?

von Johann L. (radiostar)


Lesenswert?

Markus F. schrieb:
>  Nach 4 clocks hat man vier "Zufallszahlen", die zwar
> nicht wirklich zufällig, dafür aber garantiert unterschiedlich sind.

Mal rein interessehalber: warum ist das garantiert?

von FPGA-Ingenieur (Gast)


Lesenswert?

Das ist das Wesensmerkmal dieser Ereugungsmethode. Es werden alle 
möglichen Werte geliefert und es kommt kein Wert zweimal. Allerdings ist 
genau das das Problem solcher Zufallsfolgen. In der Realität kommen 
nämlich durchaus auch einmal mehrere male dieselben Werte.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

FPGA-Ingenieur schrieb im Beitrag #4344077:
> ... die sind dann aber immer in derselben Reihenfolge, oder?
Ein 4-Bit LFSR weiderholt seine "Zufallszahlen" nach 15 Zyklen. Nur der 
Wert 0000 kommt nicht vor. Das ist nicht wirklich "zufällig", sondern 
ganz leicht zu durchschauen. Dort beim 8-Bit LFSR sieht man schon an der 
Waveform wie sich die "Zufalszahlen" 2,5 zyklisch wiederholen.

Ich würde daher ein 16 Bit LFSR nehmen, da wiederholt sich wahrnehmbar 
nichts und der Wert 0000 kommt durchaus vor, wenn nur 4 Bits aus den 16 
betrachtet werden....

Thomas G. schrieb:
> Das Programm soll folgendes machen: ...
Weil VHDL keine VHPL ist, ist das kein Programm, sondern eine 
Beschreibung...

Thomas G. schrieb:
> Sobald ich die Taste btnC drücke, soll mir das Programm die Zahlen
> "durchzählen" und sobald ich von der Taste runtergehe, sollen dann 4
> VERSCHIEDENE Zufallszahlen übrig bleiben.
Dieses Konzept wiederspricht eigentlich einer "Zufallszahl", denn ganz 
zufällig könnten 2 Zahlen ja auch mal gleich sein...

Bei 8 Bit Zufallszahlen passiert es da relativ oft, dass mindestens 2 
gleiche Zahlen herauskommen.

Thomas G. schrieb:
> Oder hat jemand konkret ganz andere Lösungsansätze?
Hast du zur Ermittlung dieser Zufallszahl ein paar Taktzyklen Zeit? Denn 
wenn da ein Taster mit im Speil ist, dann müssen die 4 Zahlen doch nicht 
in 10ns (bei einem 100MHz Takt) ermittelt werden, oder?

von Schlumpf (Gast)


Lesenswert?

Hmmm..

Wenn man eine Zufällige Zahl (der Seed aus dem Counter) in das LFSR lädt 
und dann vier mal schiebt, dann kommen zwar unterschiedliche Zahlen 
raus, aber erzeugt nicht ein identischer Seed dann auch immer die 
identische Zahlenkombination nach der gleichen Anzahl von Shifts?

Seed X erzeugt bei:
erstem Shift: Z1
zweitem Shift: Z2
drittem Shift: Z3
viertem Shift: Z4

Wird das LFSR erneut mit X geladen, so erzeugt es die identischen 
Ergebnisse für Z1...Z4

Richtig?

Somit wären nicht alle Kombinationen von Ausgangswerten möglich.

Oder sehe ich da gerade was falsch?

von P. K. (pek)


Lesenswert?

Lothar M. schrieb:
> Ich würde daher ein 16 Bit LFSR nehmen, da wiederholt sich wahrnehmbar
> nichts und der Wert 0000 kommt durchaus vor, wenn nur 4 Bits aus den 16
> betrachtet werden....

Nur must Du dann das Problem der gleichen Zahlen wieder zusätzlich 
lösen.

Angenommen, der aktuelle Stand des LFSR sei 0xAAAA und man nehme Bits 
[3:0]. Dann wird dort während 12 Zyklen nur 0xA wechselnd mit 0x5 zu 
lesen sein. Die 4 "Zufallszahlen" wären also 10,5,10,5.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

P. K. schrieb:
> Nur must Du dann das Problem der gleichen Zahlen wieder zusätzlich
> lösen.
Klar. Das bleibt unbenommen.
Deshalb meine Frage, ob ich da evtl. einfach mal "weiterwürfeln" könnte. 
Wenn für die Reaktion 10us ausreichen, dann könnte ich bei 
Zahlengleichheit und 100MHz Takt einfach noch bis zu 1000 Mal 
weiterwürfeln. Und als Notbremse einfach Z, Z+1, Z+2 und Z+3 als 
"Zufallszahl" zurückgeben...

von Schlumpf (Gast)


Lesenswert?

Man könnte eine rundlaufenden Zähler nehmen.

Mit dem Drücken der Taste zieht man eine Kopie des aktuellen 
Zählerstandes.
Das ist dann die erste Zufallszahl(Z1)

Mit dem Loslassen der Taste zieht man wieder eine Kopie des 
rundlaufenden Zählers.
Das ist dann die zweite Zufallszahl(Z2).

Damit hätte man mal zwei wirklich zufällige Zahlen.

Wie kommen wir aber auf die fehlenden zwei?

Wäre es ein Ansatz, Z1 als Seed für das LFSR zu nehmen und dies so lange 
shiften zu lassen, bis die Taste losgelassen wird und dann in dem 
Moment, wo Z2 erzeugt wird, aus dem LFSR Z3 zu ziehen?

Analog dazu wird beim Ziehen von Z2 das LSFR mit Z2 geladen und der Wert 
nach aus dem LSFR als Z4 gezogen, wenn Z1 aus dem Counter gezogen wird.

Sind die Werte dann aber wirklich unabhängig?
Die Anzahl der Shifts, die zur Erzeugung der Werte aus dem LFSR zufällig 
aufgrund der Zeiten zwischen den Flanken von BTN entstehen, sind 
identisch mit der Anzahl der Zählerschritte zwischen Z1 und Z2

von Schlumpf (Gast)


Lesenswert?

Falls das jetzt schwer verständlich war, was ich geschrieben habe:

Ich meine folgenden Ablauf:

Warte auf steigende Flanke(BTN)
Z1 = aktueller Timer-Wert
Z4 = aktueller LFSR-Wert
Lade LFSR mit aktuellem Timer-Wert

Warte auf fallende Flanke(BTN)
Z2 = aktueller Timer-Wert
Z3 = aktueller LFSR-Wert
Lade LFSR mit aktuellem Timer-Wert

Gebe Z1...Z4 aus

von Markus F. (mfro)


Lesenswert?

Die Frage betrifft ein Memory-Spiel. Keine AKW-Steuerung. Man kann's 
auch übertreiben ;)

Bei Memory geht's (jedenfalls wenn's das Memory ist, das ich kenne) 
darum, 32 Kartenpärchen zufällig zu verteilen, also 64 Karten zufällige, 
eindeutige Positionen zuzuweisen.

Beim Austeilen brauche ich bei der ersten Karte eine Zahl zwischen 0 und 
63, bei der zweiten eine zwischen 0 und 62, bei der dritten eine 
zwischen 0 und 61 u.s.w. (d.h. die schon belegten Felder werden einfach 
nicht mehr mitgezählt).

Dann kann man auch einen 16- oder gar 32-Bit Generator verwenden, weil 
"doppelte" Zufallszahlen keine Rolle mehr spielen. Dabei ist die Anzahl 
der möglichen 6-Bit Sequenzen dann so hoch, daß man nicht mehr von einer 
Zufallszahl auf die nächste schließen kann.

: Bearbeitet durch User
von Thomas G. (thomas112)


Lesenswert?

@Lothar Miller:
Nein die muss nicht sofort nach 10ns da sein, also es wäre kein Problem 
wenn ich da 50ms oder 500ms warten müsste.


An alle Anderen:
Danke für die vielen Ratschläge und Tipps, ich werde das die nächsten 
Tage mal durchgehen, und versuchen dadurch zu einem Ergebnis zu kommen.

von Fpga I. (fpga-ing)


Lesenswert?

Moin,

noch eine Idee:
Mehrere Zähler mit unterschiedlichen "Frequenzen" zählen lassen:
Z1 jeden 3ten Takt
Z2 jeden 5ten Takt
Z3 jeden 7ten Takt
Z4 jeden 11ten Takt

ggf. weitere Zähler mit anderen Vorteilern, damit Du zusätzliche Werte 
zum Aussortieren der Dupletten hast.
Man könnte auch durch die Summe oder einer xor Verknüpfung der 
Zählerstände weitere "Zufallszahlen" generieren.

Gruß fpga-ing

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

FPGA-Ingenieur schrieb im Beitrag #4344077:
> Markus F. schrieb:
>> die zwar
>> nicht wirklich zufällig, dafür aber garantiert unterschiedlich sind
>
> ... die sind dann aber immer in derselben Reihenfolge, oder?
Ja,
aber

Du weisst zu viel über wie der Zufallsgenerator "würfelt".
Jetzt stell dir vor, dein Wissen beginnt bei einem unbekannten 
Startpunkt in der der Folge und du startest deine Beobachtung.
Dann ist es für dich Zufall.

Es wird hier auch von einem Pseudzufallsgenerator gesprochen. Wenn die 
intern XOR Rückführung nicht genau bekannt ist, praktisch eine Black box 
für den Betrachter ist, dann ist es ein Zufallsgenerator.
Das es ein Zufallsgenerator wird, muss jede Umsetzung eine andere XOR 
Verknüpfung nutzen, dann "würfelt" jeder Generator eine andere Folge.


 Die Folge muss dann beobachtet werden und bei 32bit sind das eine Menge 
Zahlen und wären dann zu analysieren. Dann würde man es Herausbekommen, 
dass es kein wirklicher Zufall ist.

Der Zufallsgenerator kann auch intern eine größere Bitbreite haben als 
nach Außen sichtbar sind.
z.b. intern 32bit und 8 bit output.



Es gibt auch andere mathematische Möglichkeiten, das XOR Register ist 
die einfachste Form eines Zufallsalgorithmuses, der sich mit 
Digitalgattern umsätzen lässt.

von Markus F. (mfro)


Lesenswert?

René D. schrieb:
>
> Der Zufallsgenerator kann auch intern eine größere Bitbreite haben als
> nach Außen sichtbar sind.
> z.b. intern 32bit und 8 bit output.
>

Das muß er auch, damit's einigermaßen vernünftig "zufällig" wird. Der 
"interne" Zahlenraum muß wesentlich größer sein als der, der nach außen 
gegeben wird. Bei einem 6-Bit-Register z.B. wiederholt sich - unabhängig 
vom Seed, der ja nur den Einstiegspunkt bestimmt - die Sequenz alle 64 
Durchläufe. Wenn man sie einmal kennt, kann man von einer "Zufallszahl" 
auf die nächste schließen.
Bei einem 16-Bit Register, von dem nur 6 Bit verwendet werden, habe ich 
in diesen sechs Bit alle möglichen unterschiedlichen Sequenzen, die ich 
mir merken müsste. Damit wird's (zumindest für ein Spiel) erst 
ausreichend "zufällig".

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Markus F. schrieb:
> Bei einem 6-Bit-Register z.B. wiederholt sich - unabhängig vom Seed,
> der ja nur den Einstiegspunkt bestimmt - die Sequenz alle 64 Durchläufe.
Diese Pseudo -Zufallszahl wiederholt sich sogar schon alle 63 
Durchläufe, denn den Wert 0 gibt es nicht...

von Schlumpf (Gast)


Lesenswert?

Ich sehe hier nicht unbedingt das Problem, einen Zufallsgenerator zu 
bauen, der ausreichend unvorhersehbar ist.
Ich sehe eher das Problem, 4 unabhängige Zufallszahlen zu erzeugen, die 
auf einem GEMEINSAMEN, IDENTISCHEN Seed beruhen.

WELCHES Quadrupel kommt, ist zufällig, aber die Elemente eines 
Quadrupels sind dann immer die gleichen.
Und die generierbaren Quadrupel sind dann nur eine Teilmenge der 
mathematisch möglichen Qadrupel.

Dazu müsste man jetzt aber mal wissen, warum überhaupt für ein Memory 
ein Quadrupel aus Zahlen nötig ist und nicht ein Paar.

Und dann müsste man wissen, ob es nötig ist, dass alle Kombinationen 
innerhalb eines Quadrupels gleich wahrscheinlich sein sollten.

Annahme 1:
Man baut für jede Zahl ein eigenes LFSR mit unterschiedlicher 
Rückkopplung.
Dann füttert man die 4 LFSR mit dem identischen seed.
Dann kommen nach n Takten (bei allen LFSR) aus jedem LFSR immer das 
gleiche, reproduzierbare Ergebnis heraus.
Fügt man diese vier Zahlen dann zu dem Quadrupel zusammen, so kann man 
sagen, dass ein (zufälliger) Seed IMMER zum identischen Quadrupel führt.

Annahme 2:
Man hat nur eine LFSR und taktet das vier mal..
auch hier kommt dann immer das identische, reproduzierbare Quadrupel 
heraus.
Es gilt also auch hier: Jedem Seed ist ein fixes Quadrupel zugeordnet..

Damit sind die 4 Elemente des Quadrupels untereinander nicht zufällig 
kombiniert.
Und ich denke, darum geht es vermutlich beim Memory..

Und das hat nix mit AKW-Technik oder nicht zu tun.. ein Spiel, wo alle 
Kombinationen auftreten können sollten, dies aber technisch bedingt 
nicht tun können, funktioniert dann einfach nicht.

Wenn beim Mäxle-Würfelspiel bestimmte Würfelkombinationen nicht 
auftreten können, dann ist das Spiel einfach nicht spielbar.
Egal, wie vorhersehbar die Zufälligkeit der Kombinationen ist, die 
auftreten können.
Wenn es z.B. das "Mäxle" (21) nie geben kann, dann funktioniert das 
Spiel nicht :-(

von Michael W. (Gast)


Lesenswert?

Schlumpf schrieb:
> Annahme 2:
> Man hat nur eine LFSR und taktet das vier mal..
> auch hier kommt dann immer das identische, reproduzierbare Quadrupel
> heraus.
> Es gilt also auch hier: Jedem Seed ist ein fixes Quadrupel zugeordnet..

Wie würde man diese erzeugen?

Wenn als Beispiel 16 Bits benötigt werden, einfach 16 parallele 
Generatoren? Oder lieber Dezimieren, wie es in einigen Artikeln 
beschrieben steht?

Macht es Sinn, den Abgreifpunkt der Bits zu rotieren?

von A. F. (chefdesigner)


Lesenswert?

Schlumpf schrieb:
> Man baut für jede Zahl ein eigenes LFSR mit unterschiedlicher
> Rückkopplung.

Eher das! und zwar mit Taktgeneratoren, die nichts miteinander zu tun 
haben.

Trotzdem werden die Zahlen nicht völlig zufällig sein und ich bin 
sicher, dass sich das mathematisch auch durch ein einzige LFSR 
beschreiben liesse.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.