Forum: Mikrocontroller und Digitale Elektronik Wahrscheindlichkeit: Wiederholung 4 Byte Zufallszahl


von Sepp der Grosse (Gast)


Lesenswert?

Hallo Leute,

Will in meinen Geräten (zwecks Softwarezuordnung) eine 4 Byte 
Zufallszahl integrieren. Wie hoch ist die Wahrscheindlichkeit, das sich 
diese zufällig wiederholt? Festgelegt wird die Zahl über die RND 
Funktion von VB2008.

von lrlr (Gast)


Lesenswert?

1/(2^(4*8))

ca.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Man muss hinsichtlich der Kollionswahrscheinlichkeit zwei Fälle 
unterscheiden:

1. Wie wahrscheinlich ist es, dass eine bestimmte Zahl mehrfach 
auftritt?

2. Wie wahrscheinlich ist es, dass eine beliebige Zahl mehrfach 
auftritt?

Die schon gegebene Antwort behandelt nur Fall 1, wohingegen bei Fall 2 
das Geburtstagsparadoxon gilt. Zwar hat der Ursprungsautor seine 
Aufgabenstellung nicht hinreichend präzise formuliert, aber von der 
typischen Art dieser Aufgabe nehme ich an, dass eher Fall 2 anzuwenden 
ist.

von Volker Z. (vza)


Lesenswert?

Maximum:  1 zu 2^4
Minimum:  1 zu 1

Da es auf einem PC kein Größe gibt, die wirklich Zufällig ist, wird die 
Zeit, die der PC läuft, als Startwert der Zufallsfunktion genutzt.
(es sei den du gibst was anderes an).
Wenn Du Pech hast und genau die Gleiche Zeit erwischt erhältst Du den 
gleichen Wert.
http://msdn.microsoft.com/de-de/library/f7s023d2%28v=vs.90%29.aspx#Y729

Nimm lieber eine fortlaufende Seriennummer.

Volker

von lrlr (Gast)


Lesenswert?

@Volker :

4 BYTE und nicht 4 BIT !

ausserdem macht man zu programmstart ein Randomize() / Randomize(timer)

dass ein programm 2 mal zur selben zeit gestartet wird ist eher 
unwahrscheinlich..


@Andreas:

für fall 2 bräuchte man eine zusätzliche angabe (z.b. die anzahl an 
zufallszahlen die man braucht..)

von Tip (Gast)


Lesenswert?

Sepp der Grosse schrieb:
> Will in meinen Geräten (zwecks Softwarezuordnung) eine 4 Byte
> Zufallszahl integrieren.
Nimm doch einen Hash-Wert von der Seriennummer. Das ist übersichtlicher 
als wilde Zufallszahlen.

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


Lesenswert?

Sepp der Grosse schrieb:
> Wie hoch ist die Wahrscheindlichkeit, das sich diese zufällig wiederholt?
Eine 32-Bit Zufallszahl wiederholt sich, wenn sie mit einem LFSR 
ermittelt wird, bei einem brauchbaren Polynom nach genau 2^32-1 
Abfragen. Eine 0 kommt nicht vor: 
http://www.lothar-miller.de/s9y/categories/38-LFSR
Die Reihenfolge ist zwischen diesen Wiederholungen exakt gleich.

Allerdings gibt es auch noch andere Verfahren, Zufallszahlen 
auszurechnen. Wie gut oder schlecht die VB Funktion ist, kann ich nicht 
sagen.

von Volker Z. (vza)


Lesenswert?

lrlr schrieb:
> 4 BYTE und nicht 4 BIT !

Tschuldigung, war ein Tippfehler, sollte 64 heißen.

Ansonsten ist es ein typischer Fall der Risikobewertung.
Nicht nur die Häufigkeit eines Fehlers, auch die möglichen Folgen sind 
zu Betrachten, ob eine Sache akzeptable ist.

Sollten durch den Fehler zwei Modelbahnampeln gleichzeitig Grün zeigen, 
ist das nur optische Unschön.
Fliegen zwei A380 auf dem gleichen Kurs(weil gleiche ID) ist es alles 
andere als Unschön.

http://de.wikipedia.org/wiki/Risikomatrix

volker

von lrlr (Gast)


Lesenswert?

> sollte 64 heißen.

ist ja wie am türkischen basar..

treffen wir uns in der mitte, dann passt es..

von Michael U. (amiga)


Lesenswert?

Hallo,

ich habe mich zwar mit irgendwelchen Formeln da nie rumgeschlagen, aber 
wenn ich den (Pseudo-)-Zufallszahl-Generator einmal mit einer Seed 
gestartet ist, kann die gleiche Zahl doch auch direkt hintereinander 
kommen?

Gruß aus Berlin
Michael

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


Lesenswert?

Michael U. schrieb:
> kann die gleiche Zahl doch auch direkt hintereinander kommen?
Nicht bei den üblichen Algorithmen.

von Peter D. (peda)


Lesenswert?

Sepp der Grosse schrieb:
> Wie hoch ist die Wahrscheindlichkeit, das sich
> diese zufällig wiederholt? Festgelegt wird die Zahl über die RND
> Funktion von VB2008.

100%

RND liefert immer die gleiche Folge von Zufallszahlen.
Deshalb heißt es auch nur Pseudo-Zufall.

Du brauchst einen echten Zufallswert, welcher den Startwert von RND 
festlegt. Aber dann kannst Du ihn ja gleich nehmen.

Einen echten Zufall zu erzeugen, ist sehr schwer.
Man könnte einen Timer mit hoher Frequenz laufen lassen und den Nutzer 
per Tastendruck einen Interrupt ausführen lassen. Der Nutzer ist mit 
ziemlicher Sicherheit asynchron zum CPU-Takt.
Allerdings können Interrupts auch nicht zu jedem CPU-Zyklus ausgeführt 
werden, sondern Befehle und andere Interrupts müssen beendet sein.
Dieser Zufall ist also auch nicht wirklich gleichverteilt.
Am besten ist daher ein Input-Capture-Interrupt, der zyklusgenau den 
Zeitstempel des Tastendrucks speichert.


Windows selber kann keinen Zufall erzeugen, alles ist ja mit dem 
CPU-Takt synchron. Man braucht 2 voneinander unabhängige Takte.

Man könnte mit Google nach einem Begriff suchen und dann die Zeitdauer 
und die (hohe) Trefferanzahl verarbeiten. Das dürfte recht zufällig 
sein, wenn man das einen Tag später wiederholt.


Peter

von Peter D. (peda)


Lesenswert?

Nimm doch nen Maxim Seriennummer-IC, die haben ne weltweit einmalige 
6Byte-ID.


Peter

von J.-u. G. (juwe)


Lesenswert?

Lothar Miller schrieb:
> Michael U. schrieb:
>> kann die gleiche Zahl doch auch direkt hintereinander kommen?
> Nicht bei den üblichen Algorithmen.

Dann sind diese Algorithmen aber schlecht. Die Wahrscheinlichkeit sollte 
für jede beliebige Zahl identisch sein, unabhängig davon, wann sie schon 
mal erwürfelt wurde oder nicht.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Sepp der Grosse schrieb:
> Will in meinen Geräten (zwecks Softwarezuordnung) eine 4 Byte
> Zufallszahl integrieren.

Da du die Zufallszahlen als Identifikationsnummern nutzen möchtest,
wirst du sie wahrscheinlich in einer Datenbank o.ä. zusammen mit
anderen Infromationen zum Produkt registrieren. Um zu vermeiden, dass
zweimal die gleiche Zahl auftritt, brauchst du ja nur in der Datenbank
nachzuschauen (oder durch ein Tool nachschauen lassen), ob die Zahl
schon verwendet wird und ggf. eine neue Zufallszahl generieren.

Aber viel besser ist doch das:

Volker Zabe schrieb:
> Nimm lieber eine fortlaufende Seriennummer.

Wenn der Endanwender aus der Nummer die Seriennummer nicht
rekonstruieren können soll, kannst ja noch dies tun:

Tip schrieb:
> Nimm doch einen Hash-Wert von der Seriennummer. Das ist übersichtlicher
> als wilde Zufallszahlen.

Lothar Miller schrieb:
> Michael U. schrieb:
>> kann die gleiche Zahl doch auch direkt hintereinander kommen?
> Nicht bei den üblichen Algorithmen.

Doch, gerade bei den üblichen Algorithmen. Diese verwenden für die
interne Berechnung meist die doppelte Bitzahl. Auf PCs wird also intern
mit 64 Bit gerechnet, um eine 32-Bit-Pseudozufallszahl zu generieren.
Ein Zufallsgenerator, der zwei gleiche aufeinanderfolgende Zahlen
grundsätzlich ausschließt, taugt allenfalls als Rauschgenerator für
Soundeffekte.

von Alexander V. (avogra)


Lesenswert?

Lothar Miller schrieb:
> Michael U. schrieb:
>> kann die gleiche Zahl doch auch direkt hintereinander kommen?
> Nicht bei den üblichen Algorithmen.

Wieso nicht? Falls das nicht möglich wäre, hätte der 
Zufallszahlengenerator eine massive Schwäche. Nur relativ 
unwahrscheinlich ist es bei 2^32 verschiedenen Zahlen.

Gruß, Alex

von Εrnst B. (ernst)


Lesenswert?

Pragmatische Lösung: Teil die 64 bit auf, füll 32 Bit mit nem 
Unix-Timestamp o.Ä., die anderen 32 mit irgendwas, z.B. einer 
Pseudozufallszahl.
So kannst du bis 2037 jede Sekunde ein Gerät bauen und verkaufen, und es 
wird sich nie eine Seriennnummer wiederholen.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Peter Dannegger schrieb:
> Windows selber kann keinen Zufall erzeugen, alles ist ja mit dem
> CPU-Takt synchron. Man braucht 2 voneinander unabhängige Takte.

In einem PC gibt es eine Menge Dinge die zufällig (im Sinne von nicht 
vom CPU-Takt ableitbar) sind:
- Festplattenzugriffe
- Benutzereingaben
- Netzwerkereignisse

Jedes aktuelle Betriebssystem enthält einen Zufallszahlengenerator der 
diese Entropie einsammelt und so verwurstet dass hinten zuverlässige, 
gleichverteilte Zufallszahlen herauskommen. Unter Unix/Linux kommt man 
da über /dev/random ran, unter Windows z.B. so: 
http://msdn.microsoft.com/en-us/library/system.security.cryptography.rngcryptoserviceprovider.aspx

von Hans (Gast)


Lesenswert?

> Nimm doch nen Maxim Seriennummer-IC, die haben ne weltweit einmalige
> 6Byte-ID.

Wie groß ist die Wahrscheinlichkeit, dass du für Maxim arbeitest?

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


Lesenswert?

Alexander v. Grafenstein schrieb:
> Wieso nicht? Falls das nicht möglich wäre, hätte der
> Zufallszahlengenerator eine massive Schwäche.
J.-u. G. schrieb:
> Dann sind diese Algorithmen aber schlecht.
Es ist so, dass ein 32-Bit Zufallsgenerator bis zu 2^32 Zahlen in 
zufälliger Reihenfolge hintereinander bringt, und dann von vorn in der 
selben Reihenfolge wieder anfängt. Keine der 2^32 Zahlen kommt doppelt 
vor, und schon gar nicht hintereinander.

WENN jetzt aber statt der 32 Bit einfach 64 Bits für den Generator 
verwendet werden, und aus diesen 64 Bit dann nur 32 Bits nach aussen 
dringen, DANN kannund wird durchaus auch eine mehrfache Wiederholung von 
Zahlen drin sein.

von micha (Gast)


Lesenswert?

Lothar Miller schrieb:
> Es ist so, dass ein 32-Bit Zufallsgenerator bis zu 2^32 Zahlen in
> zufälliger Reihenfolge hintereinander bringt, und dann von vorn in der
> selben Reihenfolge wieder anfängt. Keine der 2^32 Zahlen kommt doppelt
> vor, und schon gar nicht hintereinander.

Mit Verlaub, das is Quatsch. Hier werden wild Äpfel mit Birnen 
verglichen. Als erstes kann man deterministisch keinen Zufall erzeugen, 
allenfalls eine Sequenz von Zahlen, die einige Kriterien von 
Zufallsfolgen aufweisen (daher "Pseudo-Zufallszahlen"). Da der 
verwendete Algorithmus deterministisch ist und die Länge der Zahlen 
(Bits zur Darstellung) beschränkt ist wiederholt sich die Zahlenfolge 
irgendwann. Die Länge der Sequenz ist dann die Periode des Generators. 
Je nach verwendetem Algorithmus kann die von bis gehen, je länger desto 
besser. Ein (sehr schlechter) 32 Bit Generator kann durchaus eine 
Periode von 1 haben ;-)
Die "Zufälligkeit" oder Qualität der erzeugten Zahlen ist ein ganz 
anderes Kriterium. So ist die Sequenz "1,2,3,4,5,6,7" eine perfekte, 
absolut gültige Sequenz, genauso wie "1,1,1,1,1,1,1" oder 
"2,4,7,1,6,3,5". Im allgemeinen geht sollte die Häufigkeit der einzelnen 
Bits(!) gleichverteilt sein (wenn man von gleichverteiten Zufallszahlen 
ausgeht). Je nach Algorithmus funktioniert das mehr oder weniger gut und 
ohne den zu kennen erübrigt sich jeder Spekulation.

von Peter D. (peda)


Lesenswert?

Andreas Schwarz schrieb:
> In einem PC gibt es eine Menge Dinge die zufällig (im Sinne von nicht
> vom CPU-Takt ableitbar) sind:
> - Festplattenzugriffe
> - Benutzereingaben
> - Netzwerkereignisse

Es ist aber nicht trivial, diese so zu verwursten, daß kein Einfluß des 
CPU-Taktes mehr besteht. Man muß dazu schon über die Internas gut 
Bescheid wissen, wie und wann die CPU diese Ereignisse auswertet.
Tasten- und Mauseingaben werden z.B. über den USB-Takt synchronisiert 
(alle 10ms).


Mal ein einfaches Beispiel:
AVR-Mikrokontroller:
Mainloop = Endlosschleife (RJMP = 2 Zyklen).
Taste an Interruptpin und oh Wunder, man kriegt nur gerade Zahlen vom 
Timer geliefert.
Die Erklärung: der 2-Zyklen-Befehl RJMP kann nicht unterbrochen werden.

Aber:
Taste an Pin-Change Interrupt: echter Zufall, da der Timestamp jeden 
CPU-Zyklus von der Hardware gelatcht werden kann.


Meistens braucht man aber keinen sehr guten Zufall und daher reichen die 
PC-Funktionen.
Ich hab z.B. zweimal hintereinander das gleiche Sudoku gelöst und es 
erst danach gemerkt.


Peter

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


Lesenswert?

micha schrieb:
> Lothar Miller schrieb:
>> Es ist so, dass ein 32-Bit Zufallsgenerator bis zu 2^32 Zahlen in
>> zufälliger Reihenfolge hintereinander bringt, und dann von vorn in der
>> selben Reihenfolge wieder anfängt. Keine der 2^32 Zahlen kommt doppelt
>> vor, und schon gar nicht hintereinander.
> Mit Verlaub, das is Quatsch.
Was davon denn?
Ich sehe eigentlich nur, dass deine ganze Argumentation im Grunde das 
selbe sagt, nur eben mit anderen Worten...

von Vlad T. (vlad_tepesch)


Lesenswert?

Lothar Miller schrieb:
> micha schrieb:
>> Lothar Miller schrieb:
>>> Es ist so, dass ein 32-Bit Zufallsgenerator bis zu 2^32 Zahlen in
>>> zufälliger Reihenfolge hintereinander bringt, und dann von vorn in der
>>> selben Reihenfolge wieder anfängt. Keine der 2^32 Zahlen kommt doppelt
>>> vor, und schon gar nicht hintereinander.
>> Mit Verlaub, das is Quatsch.
> Was davon denn?
> Ich sehe eigentlich nur, dass deine ganze Argumentation im Grunde das
> selbe sagt, nur eben mit anderen Worten...

nein, bildlich gesprochen propagierst du einen Zufallsgenerator ohne 
zurücklegen. und wenn keine Kugeln mehr da sind, ziehst du sie in der 
selben reihenfolge erneut.

Das entsprcht aber keinem Zufallsgernator, weil sich hier die 
Wahrscheinlichkeit, eine bestimmte Kugel zu ziehen erhöht, je mehr 
andere ich gezogen hab und somit die Zahlen nicht mehr gleichverteilt 
sind.

edit:
Ein gleichverteilter Zufallsgernator ist ein Zufallsexperiment mit 
zurücklegen.

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


Lesenswert?

Vlad Tepesch schrieb:
> nein, bildlich gesprochen propagierst du einen Zufallsgenerator ohne
> zurücklegen.
Naja, ich habe lediglich Hardware beschrieben. In der Realität wird das 
(unter strenger Missachtung der Zufallstheorie) einfach so einfach 
gemacht. Das nennt sich dann z.B. LFSR und reicht in gut 99% der Fälle 
für einen Zufall aus...

von micha (Gast)


Lesenswert?

Es hängt halt vom Generator ab. Für einen "linear feedback shift 
register" trifft Deine Beschreibung sicher zu, ich komme mehr von der 
Software-Seite und hatte einen "linear congruential generator" im Sinn. 
Und schon streiten wir uns ;-)
Aber daraus sieht man, dass ohne den Generator zu kennen gar keine 
Aussage möglich ist. Ob die Qualität/ Zufälligkeit für einen 
Anwendungsfall reicht, muss man selber herausfinden. Allerdings hast Du 
sicher Recht, dass in 99% aller Fälle ein einfaches, schnelles Verfahren 
völlig ausreicht.

Nichts für Ungut + gute WE

Michael

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


Lesenswert?

micha schrieb:
> Nichts für Ungut + gute WE
Dito. ;-)

von Vlad T. (vlad_tepesch)


Lesenswert?

Lothar Miller schrieb:
> Naja, ich habe lediglich Hardware beschrieben. In der Realität wird das
> (unter strenger Missachtung der Zufallstheorie) einfach so einfach
> gemacht. Das nennt sich dann z.B. LFSR und reicht in gut 99% der Fälle
> für einen Zufall aus...

Dann lies deinen Beitrag nochmal:
der redet von etwas völlig anderem.
du hast behautpted, dass der Zufallsgerator für n-bittige Zahlen eine 
Periode von genau 2^n hat und jede Zahl genau einmal vorkommt.

vom prinzip her also:
alle 2^n Kugeln in einen Sack schmeißen, kräftig schütteln und in einem 
Kreis hinlegen und nun der reihe nach die Zahlen vorlesen.

Tatsächlich kommt in einer Periode eines (halbwegs brauchbaren) 
Generators jede Zahl merhfach vor.

Quasi:
x*2^n Kugeln in einen Sack schmeißen ...
je größer x, desto besser natürlich. die c-standard rand() methode 
erzeugt 2^16 Zufallszahlen und arbeitet intern meist mit 32-Bit 
Variablen. Hier ist x quasi 2^16

Damit können nämlich tatsächlich die gleiche Zahl mehrmals 
hintereinander auftreten.

das ein LFSR natürlich kein allzuguter RNG ist, kann man an vielen 
stellen nachlesen, aber auf jden Fall um Längen besser, als der von dir 
erklärte Generator

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Peter Dannegger schrieb:
> Andreas Schwarz schrieb:
>> In einem PC gibt es eine Menge Dinge die zufällig (im Sinne von nicht
>> vom CPU-Takt ableitbar) sind:
>> - Festplattenzugriffe
>> - Benutzereingaben
>> - Netzwerkereignisse
>
> Es ist aber nicht trivial, diese so zu verwursten, daß kein Einfluß des
> CPU-Taktes mehr besteht.

Aber auch nicht sehr schwierig:

> Mainloop = Endlosschleife (RJMP = 2 Zyklen).
> Taste an Interruptpin und oh Wunder, man kriegt nur gerade Zahlen vom
> Timer geliefert.

Mach das 10 Mal, berechne über die Zahlen einen Hash (z.B. MD5) und 
verwende 8 Bit davon; da wirst du mit normalen Mitteln keine Systematik 
mehr finden können.

> Meistens braucht man aber keinen sehr guten Zufall und daher reichen die
> PC-Funktionen.

Für Kryptographie ist guter Zufall sehr wichtig, deshalb bringt jedes 
halbwegs aktuelle Betriebssystem einen sehr gut funktionierenden 
Zufallsgenerator mit.

> Ich hab z.B. zweimal hintereinander das gleiche Sudoku gelöst und es
> erst danach gemerkt.

Da wurde wahrscheinlich der triviale rand()-Pseudozufallszahlengenerator 
verwendet.

von Volker Z. (vza)


Lesenswert?

Irgent wie haben wir den TO verloren. Er meldet sich gar nicht mehr.

Praktikable Lösung:
Speichere alle erzeugten IDs und vergleiche, ob du sie schon mal 
vergeben hast.

Hängt aber von deiner Anwendung ab, ob das eine gute Lösung ist.
Von der wir allerdings nicht viel Wissen. Nur das sie mit Geräten 
zusammen hängt.

volker

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


Lesenswert?

Vlad Tepesch schrieb:
> du hast behautpted, dass der Zufallsgerator für n-bittige Zahlen eine
> Periode von genau 2^n hat und jede Zahl genau einmal vorkommt.
Und dabei implizit vorausgesetzt, dass die Generatorbreite gleich der 
Ausgangsbreite ist. Das mag für ein direkt druchverdrahtetes LFSR 
stimmen, aber Yalu hat es ja schon angemerkt:
Yalu X. schrieb:
> bei den üblichen Algorithmen. Diese verwenden für die
> interne Berechnung meist die doppelte Bitzahl. Auf PCs wird also intern
> mit 64 Bit gerechnet, um eine 32-Bit-Pseudozufallszahl zu generieren.

von Yalu X. (yalu) (Moderator)


Angehängte Dateien:

Lesenswert?

Ungeachtet des Sinns oder Unsinns, (Pseudeo-)Zufallszahlen zur Identifi-
zierung von Produktexemplaren zu verwenden, ist hier noch eine Antwort
auf die ursprüngliche Frage:

Die Diagramme zeigen für eine gegebene Anzahl von 32-Bit-Zufallszahlen
die Wahrscheinlichkeit, dass sich darunter mindestens zwei gleiche
befinden. Man sieht, dass bei 10000 Zahlen die Wahrscheinlichkeit schon
über 1%, für 77000 etwa 50% und für 200000 sogar über 99% beträgt.

Für Großserienprodukte ist das Verfahren mit den Zufallszahlen ohne
spezielle Vorkehrungen zur Vermeidung von Dubletten also nicht geeignet.

Das ist eigentlich erstaunlich, weil die 200000 Zahlen gerade einmal
einen Anteil von 0,047 Promille der Gesamtanzahl (2³²) ausmachen. Das
Erstaunen legt sich aber wieder, wenn man das Geburtstagsparadoxon
kennt:

  http://de.wikipedia.org/wiki/Geburtstagsparadoxon

von Andreas K. (derandi)


Lesenswert?

Warum muss das ne Zufallszahl und keine fortlaufende Seriennummer sein?

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.