Forum: Mikrocontroller und Digitale Elektronik Formel für Pseudozufallszahlen


von Stefan (Gast)


Lesenswert?

Hallo,

weiß jemand, ob es eine mathematische Funktion gibt, mit der man 
Pseudozufallszahlen generieren kann, also eine Funktion in der Form

y = f(x)

Wobei y dann die Pseudozufallszahl zum jeweiligen x ist.

von DraconiX (Gast)


Lesenswert?

1
y = rand() % Bereich;

von DraconiX (Gast)


Lesenswert?

DraconiX schrieb:
> y = rand() % Bereich;

oder auch mit seed natürlich:
1
int seed = 542;
2
3
y = rand(seed) % Bereich

von Md M. (Firma: Potilatormanufaktur) (mdma)


Lesenswert?

Stefan schrieb:
> weiß jemand, ob es eine mathematische Funktion gibt, mit der man
> Pseudozufallszahlen generieren kann

Ja, gibt es. Sonst würde es ja keine Pseudozufallszahlengeneratoren 
geben und auch keine Pseudozufallszahlen.

> also eine Funktion in der Form
>
> y = f(x)
>
> Wobei y dann die Pseudozufallszahl zum jeweiligen x ist.

Am einfachsten:

y = seed

Hast schonmal den Wikipedia-Artikel gelesen?

von Thomas E. (picalic)


Lesenswert?

Wird über linear rückgekoppelte Schieberegister "errechnet". Ob bzw. wie 
man das als "Formel" bezeichnen kann, überlasse ich den Mathematikern. 
Ich muß mir sowas eher technisch, als Hardware oder Programm, 
vorstellen, um es zu verstehen.

von Thomas W. (diddl)


Lesenswert?

DraconiX schrieb:
> DraconiX schrieb:
>> y = rand() % Bereich;
>
> oder auch mit seed natürlich:
>
>
1
> 
2
> int seed = 542;
3
> 
4
> y = rand(seed) % Bereich
5
> 
6
>

Ja, wobei es schöner ist, statt einer Konstante zb. einen Timerwert zu 
verwenden.



Außer man macht eine Testserie ...

von Dussel (Gast)


Lesenswert?

Das hat vor ein paar Tagen schonmal gefragt. Ich habe aber jetzt nicht 
nachgelesen, ob es Antworten gibt.
Beitrag "Deterministischer Pseudozufall"

von THOR (Gast)


Lesenswert?

Also ne mathematische Funktion y = f(x) kann es so in dem Sinne nicht 
geben, den die ist deterministisch und Zufallszahlen sollen ja gerade 
nicht deterministisch sein.

Anders gesagt: Wenn du ne feste mathematische Funktion wie y = x² + 2x - 
5 hast, dann kannst du die beliebig oft ausrechnen und es wird jedesmal 
für das gleiche x auch das gleiche y rauskommen.

Das gilt auch für Differentialgleichungen, Integrale und was es da sonst 
noch gibt.

Wenn du jetzt ne Pseudozufallszahl haben willst, dann gibts da 
verschiedene Verfahren, das rückgekoppelte Schieberegister wurde schon 
genannt.
Das ist auch deterministisch, mit dem gleichen Startwert kommt immer die 
gleiche Zufallszahlenfolge raus.
Die Zufallszahlen sind also in sich schon zufällig (in dem Sinne, dass 
alle Zahlen des Intervalls gleich große Wahrscheinlichkeit haben, wie 
bei einem fairen Würfelwurf). Aber die Zahlen sind trotzdem vorhersagbar 
und taugen daher nicht für Krypto.
y = rand(seed); ist sowas. Zumindest meistens, Doku lesen.

Es gibt noch die häufig eingesetzte Lösung y = rand(seed) wobei seed ein 
tatsächlich komplett zufälliger Wert ist, der jedesmal neu gewählt wird. 
Beliebt: Seed von Random.org holen. Aber dann mehrfach und daraus nen 
Hash berechnen und die Hashes dürfen nicht gleich sein. Es gab mal den 
Fall wo random.org down war und die Seeds waren alles Hashes der 404 
Fehlermeldung. Da hat sich dann irgendein schlauer Mensch selbst 1000 
Bitcoins überwiesen ;)

von THOR (Gast)


Lesenswert?

Weitere Quellen für Zufälligkeit (Entropie genannt):

- Maus- und Tastaturereignisse mitschneiden, in eine Integer-Zahl 
verwursten, daraus nen Hash berechnen
- Zeit in ms seit Rechner- bzw. Programmstart
- Absolute Uhrzeit in Unix-millisekunden
- MAC-Adresse und IP des primären Netzwerkadapters zu nem Hash 
verwursten

usw usw

von Stefan (Gast)


Lesenswert?

Danke für die Antworten!

THOR schrieb:
> Anders gesagt: Wenn du ne feste mathematische Funktion wie y = x² + 2x -
> 5 hast, dann kannst du die beliebig oft ausrechnen und es wird jedesmal
> für das gleiche x auch das gleiche y rauskommen.

Genau so war die Frage gemeint.

Gibt es eine Formel wie z.B.

y = (3*x^(x+2)+5*x^(x+4)+7*x^(x+6))/(2*x^(x+1)+4*x^(x+3)+6*x^(x+5))

die für jedes x eine feste "Zufallszahl" y ausspuckt?

Beitrag #4989714 wurde vom Autor gelöscht.
von Daniel F. (df311)


Lesenswert?

Stefan schrieb:
> Gibt es eine Formel wie z.B.
>
> y = (3*x^(x+2)+5*x^(x+4)+7*x^(x+6))/(2*x^(x+1)+4*x^(x+3)+6*x^(x+5))
>
> die für jedes x eine feste "Zufallszahl" y ausspuckt?

warum nicht einfach eine lookup-table?

von Dussel (Gast)


Lesenswert?

Stefan schrieb:
> Gibt es eine Formel wie z.B.
>
> y = (3*x^(x+2)+5*x^(x+4)+7*x^(x+6))/(2*x^(x+1)+4*x^(x+3)+6*x^(x+5))
>
> die für jedes x eine feste "Zufallszahl" y ausspuckt?
Nicht in der Art, aber eine Hashfunktion macht das.

von Bitwurschtler (Gast)


Lesenswert?

Stefan schrieb:

> weiß jemand, ob es eine mathematische Funktion gibt, mit der man
> Pseudozufallszahlen generieren kann, also eine Funktion in der Form
>
> y = f(x)
>
> Wobei y dann die Pseudozufallszahl zum jeweiligen x ist.

schau mal nach "Linear rückgekoppeltes Schieberegister" engl LFSR oder 
"Maximum length sequence". Damit erzeugt man Sequenzen zufällig 
verteilter Binärzahlen. x währe dann der Index in dieser Sequenz 
generecht ab dem Initialisierung.

Die Mathematik dazu findet sich wohl unter dem Stichwort Galoisfelder 
o.ä..

von Daniel F. (df311)


Lesenswert?

verdammt, zu spät dran mit bearbeiten.

Stefan schrieb:
> Gibt es eine Formel wie z.B.
>
> y = (3*x^(x+2)+5*x^(x+4)+7*x^(x+6))/(2*x^(x+1)+4*x^(x+3)+6*x^(x+5))
>
> die für jedes x eine feste "Zufallszahl" y ausspuckt?

da für jedes x eine "feste Zufallszahl" gefragt ist, erfüllt jede 
injektive funktion die genannte bedingung.

im einfachsten fall: y = x

von THOR (Gast)


Lesenswert?

Daniel F. schrieb:
> verdammt, zu spät dran mit bearbeiten.
>
> Stefan schrieb:
>> Gibt es eine Formel wie z.B.
>>
>> y = (3*x^(x+2)+5*x^(x+4)+7*x^(x+6))/(2*x^(x+1)+4*x^(x+3)+6*x^(x+5))
>>
>> die für jedes x eine feste "Zufallszahl" y ausspuckt?
>
> da für jedes x eine "feste Zufallszahl" gefragt ist, erfüllt jede
> injektive funktion die genannte bedingung.
>
> im einfachsten fall: y = x

Etwas allgemeiner ausgedrückt: y kann nur so zufällig sein wie x. Oder 
im Fachterminus: Die Entropie lässt sich mit deterministischen 
Funktionen nicht steigern.
Daher ist in der Praxis Entropiegewinnung äußerst wichtig. Die gesamte 
Kryptographie hat das Problem, dass Computer deterministisch sind (also 
wie y=x).

von nixundnul (Gast)


Lesenswert?

y=sin(x) ausrechnen und dann die 4., 5. und 6 Stelle nach dem Komma 
verwenden. Den Rest wegwerfen. x wahlweise als fortlaufenden Wert oder 
das y verwenden. Das hat für die Spielprogrammierung unter der Bank in 
der Berufsschule (vor 30 Jahren) ausgereicht.

von Der Andere (Gast)


Lesenswert?

nixundnul schrieb:
> Das hat für die Spielprogrammierung unter der Bank in
> der Berufsschule (vor 30 Jahren) ausgereicht.

Ein genialer mathematischer Beweis ...

SCNR

von Der Andere (Gast)


Lesenswert?

@Stefan:
By the way, aus welcher Zahlenmenge, bzw Definitionsbereich  soll denn x 
und y sein?
N, R, Z, ...?

Oder beschreibe einfach mal dein eigentliches Problem.

von nixundnul (Gast)


Lesenswert?

Der Andere schrieb:
> nixundnul schrieb:
>> Das hat für die Spielprogrammierung unter der Bank in
>> der Berufsschule (vor 30 Jahren) ausgereicht.
>
> Ein genialer mathematischer Beweis ...
>
> SCNR

war der gefragt? Schließlich geht es um Pseudo-Zufallszahlen. Und 
rückgekoppeltes Schieberegister ist deterministisch und wiederholt sich 
auch. Es geht (mir) eher darum, wie man in einer gegebenen 
Programmiersprache mit dem wenigsten Aufwand ein ausreichendes 
Ergebnis erzielt. Programmiersprache und Anforderungen kennen wir nicht. 
GOTO 10.
(damals war es SHARP1210-Basic)

von Schreiber (Gast)


Lesenswert?

Stefan schrieb:
> weiß jemand, ob es eine mathematische Funktion gibt, mit der man
> Pseudozufallszahlen generieren kann, also eine Funktion in der Form

ja. gibt es. Man sollte nur wissen, wozu man die Zufallszahlen benötigt.
Für Verschlüsselung braucht es andere ufallszahlen wie für statistische 
Testverfahren.

von Baldrian (Gast)


Lesenswert?

Schreiber schrieb:
> Stefan schrieb:
>> weiß jemand, ob es eine mathematische Funktion gibt, mit der man
>> Pseudozufallszahlen generieren kann, also eine Funktion in der Form
>
> ja. gibt es. Man sollte nur wissen, wozu man die Zufallszahlen benötigt.
> Für Verschlüsselung braucht es andere ufallszahlen wie für statistische
> Testverfahren.

Die meisten Antworten sind so blöd, wie die von Schreiber.

Hier ein Link zur Frage:

http://www.math.uni-frankfurt.de/~numerik/lehre/Vorlesungen/Comp_Fin09/skript/n-shell3.pdf

von Bitwurschtler (Gast)


Lesenswert?

Baldrian schrieb:
> Schreiber schrieb:
>> Stefan schrieb:
>>> weiß jemand, ob es eine mathematische Funktion gibt, mit der man
>>> Pseudozufallszahlen generieren kann, also eine Funktion in der Form
>>
>> ja. gibt es. Man sollte nur wissen, wozu man die Zufallszahlen benötigt.
>> Für Verschlüsselung braucht es andere ufallszahlen wie für statistische
>> Testverfahren.
>
> Die meisten Antworten sind so blöd, wie die von Schreiber.

Der Schreiber hat aber schon recht, es gibt unterschiedliche 
Anforderungen an Pseudozufallsreihen. Und das meint nicht nur die 
spektralen Eigenschaftzen sondern auch den Ressourcenbedarf bei der 
Generierung.

> http://www.math.uni-frankfurt.de/~numerik/lehre/Vo...

Naja mit der Forderung nach Unverhersehbarkeit (s. S.46) schliessen die 
schon mal die in der Praxis häufig verwenden Generatoren aus. Es geht ja 
hier um Pseudozufall und nicht Zufall im Sinne der ergrauten 
Mathematiker im universitären Elfenbeinturm.

von c.m. (Gast)


Lesenswert?

schau dir das mal an:
1
x = 4x(1-x)

x müsste man dann multiplizieren, und mit modulo den gewünschten bereich 
rausrechen.
ob und wie periodisch das ganze ist weiß ich nicht.
1
#!/usr/bin/perl
2
3
my $x = 0.1487423874; # seed zwischen 0..1
4
5
while (true) {
6
  $x = 4*$x*(1-$x);
7
  print "$x\n";
8
}
1
0.0616415806104669
2
0.231367584601241
3
0.711346501588114
4
0.821330625065862
5
0.586986517579131
6
0.969733383037822
7
0.11740219543937
8
0.414475679781545
9
0.970742362604685
10
0.113606512197437
11
0.402800290335083
12
0.962208865764223
13
0.1454518576358
14
0.49718245898438
15
0.999968245850501
16
0.000127012564691813
17
0.000507985730000895
18
0.00203091072199604
19
0.00810714449454129
20
0.0321656748107437
21
0.124524176698853
22
0.436071624465302
23
0.983652651205979
24
0.0643204519257122
25
0.240733325559137
26
0.731123166097503
27
0.786328328372264
28
0.672064353486179
29
0.881575433037533
30
0.417600755608878
31
0.972841458095088
32
0.105683822026044
33
0.378059007152044
34
0.94052157705302
35
0.223762960602882
36
0.694772392260461
37
0.848254860852549

von Jürgen S. (jurs)


Lesenswert?

Stefan schrieb:
> Hallo,
>
> weiß jemand, ob es eine mathematische Funktion gibt, mit der man
> Pseudozufallszahlen generieren kann, also eine Funktion in der Form
>

Nein, es gibt nicht nur "eine", sondern es gibt "viele" verschiedene 
Algorithmen(Funktionen) zur Ermittlung von Pseudo-Zufallszahlen.

Allen gemeinsam ist, dass sie einen "Startwert " (Seed) eingebaut haben, 
mit dem der Algorithmus startet, bei jedem Funktionsaufruf w wird nicht 
nur eine neue Pseudo-Zufallszahl ermittelt, sondern auch die Bits des 
"Seed" durcheinander gewürfelt, mit dem dann weitergerechnet wird.

Jede Programmiersprache hat einen Pseudo-Zufallszahlengenerator 
eingebaut, oft mit dem Namen "rand()" oder "random()", die Du benutzen 
kannst.

Abhängig von der Mikrocontroller-Plattform kann es allerdings auch sein, 
dass Du mit der Software nicht nur einen Funktionsaufruf für die 
Ermittlung einer Pseudo-Zufallszahl verwenden kannst, sondern dass die 
Controller-Hardware einen True-Random-Number-Generator bereitstellt, aus 
dem Du per Funktionsaufruf eine echte Zufallszahl statt einer 
Pseudo-Zufallszahl bekommst.

Worauf beziehst Du Deine Frage genaau?

Suchst Du eine (einfache?) Funktion als Zufallszahlengeneratorfunktion 
in einer bestimmten Programmiersprache? Oder suchst Du den Namen einer 
Zufallszahlengeneratorfunktion für eine bestimmte Plattform?

: Bearbeitet durch User
von Brummbär (Gast)


Lesenswert?

THOR schrieb:
> MAC-Adresse und IP des primären Netzwerkadapters zu nem Hash
> verwursten

Beides ist, zumindest bei mir, nicht entropiebehaftet sondern immer 
identisch (zumindest auf meinem Rechner).

von Marek N. (Gast)


Lesenswert?

Such mal nach m-Folge Generator oder linear rückgekoppletes 
Schieberegister.

von Timm T. (Gast)


Lesenswert?

nixundnul schrieb:
> y=sin(x) ausrechnen und dann die 4., 5. und 6 Stelle nach dem Komma
> verwenden.

Mit etwas Überlegen finden sich bestimmt noch umständlichere Verfahren, 
die sich auf einem uC noch schlechter implementieren lassen.

Warum das einfach zu implementierende bitweise Schieberegister nehmen, 
welches mit ein paar Shifts und Xors auskommt, wenn man so richtig 
Rechenzeit und Speicher verschwenden kann?

von Axel S. (a-za-z0-9)


Lesenswert?

Stefan schrieb:
> weiß jemand, ob es eine mathematische Funktion gibt, mit der man
> Pseudozufallszahlen generieren kann, also eine Funktion in der Form
>
> y = f(x)
>
> Wobei y dann die Pseudozufallszahl zum jeweiligen x ist.

Jein.

Ein Pseudozufallsgenerator ist idR. nicht als Funktion implementiert, 
insbesondere nimmt er keinen Parameter (x) entgegen. Das hat auch keinen 
Sinn, weil man ja ein zufälliges Ergebnis haben will. Wenn das 
Ergebnis direkt vom Parameter x abhängig wäre, dann wäre es nicht 
zufällig. Und wenn es nicht von x abhängig ist, dann braucht man x auch 
nicht erst zu übergeben.

Wenn real existierende Zufallszahlenfunktionen Parameter nehmen, dann 
nicht um den Zufall zu beeinflussen, sondern um den Wertebereich 
einzugrenzen, aus dem die Funktion eine Zahl zufällig wählt.

Die meisten Zufallszahlengeneratoren sind so implementiert, daß sie 
einen internen Zustand haben. Bei jedem Abruf einer Zufallszahl wird der 
interne Zustand durcheinandergewürfelt und im Ganzen oder teilweise 
zurückgegeben. Zur Initialisierung des internen Zustanden gibt es meist 
eine eigene Funktion, oft mit einem Namen ähnlich wie rand_seed()

Bei den schon genannten linear rückgekoppelten Schieberegistern ist der 
Inhalt des Schieberegisters der interne Zustand. Und bei jedem 
Taktschritt fällt ein Bit als zufällige Zahl heraus.

Eine andere weit verbreitete Implementierung ist der lineare 
Kongruenzgenerator (LCG). Der interne Zustand ist eine Integerzahl, z.B. 
uint32. Bei jedem Aufruf wird aus dem alten Zustand x_i der neue Zustand 
x_i+1 durch eine einfache lineare Operation gebildet:

x_i+1 = (a*x_i + c) mod m

a, c und m sind dabei so gewählt, daß der Generator die größtmögliche 
Periode m hat. Beispiele siehe z.B. hier:

https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use

Speziell bei einem µC stellt sich das Problem der Initialsierung des 
Zufallsgenerators. Denn nach dem Einschalten der Stromversorgung werden 
alle Variablen mit definierten Werten initialisiert. Der Generator 
liefert dann immer die gleiche Zahlenfolge. Wenn man das ändern will, 
muß man sich irgendwie einen echt zufälligen Startwert beschaffen.

von Stephan (Gast)


Lesenswert?

Axel S. schrieb:
> peziell bei einem µC stellt sich das Problem der Initialsierung des
> Zufallsgenerators. Denn nach dem Einschalten der Stromversorgung werden
> alle Variablen mit definierten Werten initialisiert. Der Generator
> liefert dann immer die gleiche Zahlenfolge. Wenn man das ändern will,
> muß man sich irgendwie einen echt zufälligen Startwert beschaffen.

das kann man mit einem A/D machen der zB. das Rauschen einer Diode 
misst.
Oder ich bilde eine CRC über den RAM Bereich der ja dann rein zufällige 
Werte hat, sofern er nicht systematisch geleert wird. Oder Oder Oder

von Ordner (Gast)


Lesenswert?

Stephan schrieb:
> Axel S. schrieb:
>> liefert dann immer die gleiche Zahlenfolge. Wenn man das ändern will,
>> muß man sich irgendwie einen echt zufälligen Startwert beschaffen.
>
> das kann man mit einem A/D machen der zB. das Rauschen einer Diode
> misst.

Da ein AD-Wandler nur eine begrenzte Auflösung hat, beispielsweise 8bit 
oder ^10Bit und damit nur einen sehr begrenzten Wertebereich (256, 1024 
Elemente) aufweist ist das wohl kaum als "echt zufälliger Startwert" zu 
bezeichnen.

von Der Andere (Gast)


Lesenswert?

Baldrian schrieb:
> Die meisten Antworten sind so blöd, wie die von Schreiber.
>
> Hier ein Link zur Frage:
>
> 
http://www.math.uni-frankfurt.de/~numerik/lehre/Vorlesungen/Comp_Fin09/skript/n-shell3.pdf

Baldian ist also der Selbe wie Stefan und das ist eine (Haus)aufgabe.
Halte dich an die Forumsregeln!

von Stephan (Gast)


Lesenswert?

der "echte" ist doch nur echt, weil nicht vorhersehbar. Das ist doch 
durch zB. das Rauschen gegeben. Ich glaube Intel hat sowas auch in den 
CPU mal gemacht. Dann kann ich doch damit weiterrechnen wie ich will.

von Possetitjel (Gast)


Lesenswert?

Axel S. schrieb:

> Ein Pseudozufallsgenerator ist idR. nicht als Funktion
> implementiert, [...]

... wobei auch das ohne weiteres moeglich ist.

Im Zusammenhang mit dem DES habe ich gelesen, dass es
umfangreiche Untersuchungen gibt, die seine Qualitaeten
als Pseudozufallszahlengenerator belegen.

von Ordner (Gast)


Lesenswert?

Possetitjel schrieb:
> Im Zusammenhang mit dem DES habe ich gelesen, dass es
> umfangreiche Untersuchungen gibt, die seine Qualitaeten
> als Pseudozufallszahlengenerator belegen.

Ja weil des ja ein Qualitätsmerkmal eines guten Encoders ist. Dessen 
Output ist mit statistischen Mitteln nicht von Rauschen unterscheidbar, 
alle statistischen Eigenschaften des plain textes wie 
Buchstabenhäufigkeit sind durch das Codieren "entfernt".

von Ruediger A. (Firma: keine) (rac)


Lesenswert?

Jürgen S. schrieb:
> Stefan schrieb:
> Abhängig von der Mikrocontroller-Plattform kann es allerdings auch sein,
> dass Du mit der Software nicht nur einen Funktionsaufruf für die
> Ermittlung einer Pseudo-Zufallszahl verwenden kannst, sondern dass die
> Controller-Hardware einen True-Random-Number-Generator bereitstellt, aus
> dem Du per Funktionsaufruf eine echte Zufallszahl statt einer
> Pseudo-Zufallszahl bekommst.
>

genau, z.B. der RNG im STM32F4xx.

Allerdings wird der TO ja (hoffentlich) wissen, warum er EXPLIZIT nach 
einem Pseudrandomgenerator gefragt hat...

von Dussel (Gast)


Lesenswert?

Ruediger A. schrieb:
> Allerdings wird der TO ja (hoffentlich) wissen, warum er EXPLIZIT nach
> einem Pseudrandomgenerator gefragt hat...
Hat er ja noch nichtmal. Das ist nur im Betreff falsch angegeben. 
Deshalb verstehe ich die Diskussion über Startwerte nicht. Er braucht 
keinen Startwert.

Anscheinend will er eine Funktion, die Eingabewerte auf zufällig 
scheinende Ausgabewerte abbildet.
Deshalb der Vorschlag mit den Hasfunktionen. Die machen genau sowas.
Die letzten vier Stellen von MD5 zum Beispiel ergeben
0->64da
1->849b
2->862c
3->baf3
Die Eingangsfolge ist linear, die Ausgangsfolge 'zufällig' verteilt.

Da er nicht geschrieben hat, wofür er das braucht, muss er selber 
entscheiden wie die Abwägung zwischen Berechnungsaufwand und 
'Zufälligkeit' ausfällt.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

DraconiX schrieb:
>
1
> 
2
> y = rand() % Bereich;
3
> 
4
>

rand ist keine mathematische Funktion.

von Ralf (Gast)


Lesenswert?

Naturereignisse wie Uhrzeit, Temperatur, Windgeschwindigkeit, Helligkeit 
digitalisieren und dann für die Bildung der Zufallszahlen 
weiterverwenden.

von Rudolph R. (rudolph)


Lesenswert?


von Dimpel (Gast)


Lesenswert?

Ich brauch die Lottozahlen für die kommende Ziehung, hat da wer was?

von Md M. (Firma: Potilatormanufaktur) (mdma)


Lesenswert?

Dimpel schrieb:
> Ich brauch die Lottozahlen für die kommende Ziehung, hat da wer was?

Findest du in der Zahl Pi irgendwo hinterm Komma.

von meckerziege (Gast)


Lesenswert?

DraconiX schrieb:
> y = rand() % Bereich;

STOP! Das erzeugt keine gleichverteilten Zufallszahlen!


Die erste Frage sollte sein: Wofür brauchst du die Zahlen?
- Elektronischer Würfel?
- Krypto-Anwendung?

von Dussel (Gast)


Lesenswert?

Md M. schrieb:
> Dimpel schrieb:
>> Ich brauch die Lottozahlen für die kommende Ziehung, hat da wer was?
>
> Findest du in der Zahl Pi irgendwo hinterm Komma.
Mal so ein bisschen abseits vom Thema, ist das eigentlich bewiesen? Es 
könnte ja sein, dass Pi irgendwann zum Beispiel nur noch aus 
10100100010000 und so weiter besteht. Dann wäre es immer noch 
irrational, würde aber nicht alle Informationen enthalten.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?


von Frank N. Stein (Gast)


Lesenswert?

Ich kenne das Problem. Die Vorschläge zu Rauschen, Wetterereignissen, 
etc. nutzen ja nicht viel, da eine Funktion y = f(x) gefragt ist, d.h. 
reproduzierbar gleiche Ausgabe bei gleicher Eingabe. Wobei die Ausgabe, 
wenn man 1, 2, 3, 4, 5, ... reinsteckt, eben möglichst (wie man das auch 
immer definiert) "zufällig" sein soll.
Beispiel aus der Praxis: Man hat zwei getrennte Geräte und in jedem 
läuft eine Uhr und man möchte zufällige Ereignisse haben, die bei beiden 
Geräten gleichzeitig auftreten. Dann könnte man mit so einer Funktion, 
die die Zeit als Eingabe hat, solchen Zufall erzeugen.

Vorschläge wie die x. Stelle von Pi sind nicht so gut, da die Laufzeit 
eines solchen Algorithmus immer größer wird, je mehr Zeit vergeht.

Der Vorschlag mit der 3-5. Nachkommastelle des Sinus ist drollig. 
Wahrscheinlich wird das Beste in der Tat irgendeine solche oder ähnlich 
Hash-Funktion sein. Je nach Mikrocontroller müsste es halt 
ressourcenschonend sein. Das kann man sich dann mal überlegen. 
Vielleicht meldet sich der OP ja nochmal.

von √π (Gast)


Lesenswert?

Marek N. schrieb:
> Such mal nach m-Folge Generator oder linear rückgekoppletes
> Schieberegister.

Wurde in diesem Thread jetzt schon öfter genannt. Wie oft denn noch? Ja 
damit kann man Pseudozufallszahlen generieren. Es kommt aber auch bei 
jedem Durchlauf das gleiche raus.

von √π (Gast)


Lesenswert?

Frank N. Stein schrieb:
> und man möchte zufällige Ereignisse haben, die bei beiden
> Geräten gleichzeitig auftreten.

Genau das macht man mit Schieberegistern, die bei beiden Geräten gleich 
geschaltet sind
https://de.wikipedia.org/wiki/Linear_r%C3%BCckgekoppeltes_Schieberegister

von Frank N. Stein (Gast)


Lesenswert?

Du setzt dann aber voraus, dass die Geräte ständig laufen.

Wenn eines aber mal ausgeschaltet ist und dann neu gestartet wird, 
sollte man höchstens die Zeit richtig stellen müssen. Der inneren 
Zustände der Schieberegister wären dann trotzdem nicht synchron. Kannst 
du folgen?

von Jobst M. (jobstens-de)


Lesenswert?

Frank N. Stein schrieb:
> Dann könnte man mit so einer Funktion,
> die die Zeit als Eingabe hat, solchen Zufall erzeugen.

Nein, das ist eben deshalb schon mal kein Zufall.


√π schrieb:
> Es kommt aber auch bei
> jedem Durchlauf das gleiche raus.

Das ist eben pseudo. Genau das, was der TO möchte.


Gruß
Jobst

von Martin L. (maveric00)


Lesenswert?

Hallo!

Dussel schrieb:
> Md M. schrieb:
>> Dimpel schrieb:
>>> Ich brauch die Lottozahlen für die kommende Ziehung, hat da wer was?
>>
>> Findest du in der Zahl Pi irgendwo hinterm Komma.
> Mal so ein bisschen abseits vom Thema, ist das eigentlich bewiesen? Es
> könnte ja sein, dass Pi irgendwann zum Beispiel nur noch aus
> 10100100010000 und so weiter besteht. Dann wäre es immer noch
> irrational, würde aber nicht alle Informationen enthalten.


Nein, ist nicht bewiesen. Pi ist zwar irrational und transzendent (und 
damit nicht periodisch), aber ob Pi normal ist oder nicht ist noch nicht 
sicher ( https://de.wikipedia.org/wiki/Normale_Zahl ), wenn auch 
wahrscheinlich (laut Analyse der ersten 6 Milliarden Stellen).



Schöne Grüße,
Martin

: Bearbeitet durch User
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

THOR schrieb:
> Also ne mathematische Funktion y = f(x) kann es so in dem Sinne nicht
> geben, den die ist deterministisch und Zufallszahlen sollen ja gerade
> nicht deterministisch sein.

Es wurde nach PSEUDO-Zufallszahlen gefragt.  Und diese (bzw. eine 
entsprechende Folge) hat eben die Eigenschaft, dass die reproduzierbar 
ist.

> Anders gesagt: Wenn du ne feste mathematische Funktion wie y = x² + 2x -
> 5 hast, dann kannst du die beliebig oft ausrechnen und es wird jedesmal
> für das gleiche x auch das gleiche y rauskommen.

Ganau.  Und sowas o.ä. sucht der OP, wobei er eigentlich eine 
Hash-Funktion meint, d.h. das Ergebnis von f(x) ist deterministisch, 
aber "wüst" verstreut, idealerweise einer vorgegebenen Verteilung wie 
Gleichverteilung oder Normalverteilung folgend.

> Das gilt auch für Differentialgleichungen, Integrale und was es da sonst
> noch gibt.

Es gibt noch viiiel mehr :-)

> y = rand(seed); ist sowas. Zumindest meistens, Doku lesen.

Nein, denn rand(seed) ist KEINE mathematische Funktion:

Eine mathematische Funktion liefert für eine gegebene Eingabe eine 
entsprechende Ausgabe.  Beispiel: f(x) = x².  Egal, zu welcher Uhrzeit 
oder bei welchem Wetter oder auf welchem Planeten du diese Funktion 
auswertest, wenn x gleich bleibt, dann tut es auch f(x).

von Frank N. Stein (Gast)


Lesenswert?

Johann, hast du eine Idee zu einer solchen Hash-Funktion, wie von dir 
beschrieben? Also möglichst ressourcenschonend (wenige Zyklen) für einen 
AVR? Am besten sollte ein uint32_t rauskommen. Ich hätte eine Verwendung 
dafür. :)

von Bernd K. (prof7bit)


Lesenswert?

Stefan schrieb:
> y = f(x)
>
> Wobei y dann die Pseudozufallszahl zum jeweiligen x ist.

Such mal nach Hash-Funktion.

von Timm T. (Gast)


Lesenswert?

Frank N. Stein schrieb:
> Wenn eines aber mal ausgeschaltet ist und dann neu gestartet wird,
> sollte man höchstens die Zeit richtig stellen müssen.

Dann nimm halt einen MD5-Hash über die Zeit.

Nur, was machst Du, wenn die eine Uhr 2 Sekunden nachgeht?

von Frank N. Stein (Gast)


Lesenswert?

Wenn die eine Uhr 2 Sekunden nachgeht, weil vom Anwender falsch 
gestellt: Sein Pech.

Wenn die Uhr falsch geht, weil die Quarze nicht ganz synchron laufen: 
Dann nützt auch ein anderer Pseudozufallsgenerator nix.

MD5 ist aber ganz schön heavy für einen AVR. ;)

von Peter M. (r2d3)


Lesenswert?

In dem Buch "Kryptografie" von Klaus Schmeh findest Du eine Reihe von 
Verfahren zuzüglich Erklärung, welche Verfahren wofür eingesetzt werden.

Dazu gehören auch Verfahren mit geringem Rechenaufwand für 
schwachbrüstige CPUs.

von Jürgen S. (jurs)


Lesenswert?

Frank N. Stein schrieb:
> Johann, hast du eine Idee zu einer solchen Hash-Funktion, wie von dir
> beschrieben? Also möglichst ressourcenschonend (wenige Zyklen) für einen
> AVR? Am besten sollte ein uint32_t rauskommen. Ich hätte eine Verwendung
> dafür. :)

Ich poste hier jetzt einfach mal eine random-number-Generatorfunktion, 
die speziell für Arduino vorgesehen ist und einen unsigned int (16-bit) 
im Wertebereich 0 bis 65535 erzeugt:


// create a random integer from 0 - 65535
unsigned int rng() {
  static unsigned int y = 0;
  y += micros(); // seeded with changing number
  y ^= y << 2; y ^= y >> 7; y ^= y << 7;
  return (y);
}

Auf den als static-VVariable gehaltene Seed-Wert "y" wird bei jedem 
Funktionsaufruf der Stand des Arduino-Mikrosekundenzählers draufaddiert, 
so dass jedesmal mit einem anderen seed gerechnet wird.

Die Funktion ist sehr schnell, also wenn Du statt eines 16-bit 
Ergebnisses lieber ein 32-bit Ergebnis haben möchtest, lass die Funktion 
einfach zweimal laufen und schiebe die 2*16-Bit zu einem 32-Bit Wert 
zusammen.

Und wenn es allgemein für AVR sein soll und nicht für Arduino und Du 
daher die micros() Funktion nicht zur Verfügung hast, dann würde ich 
statt micros einfach immer wechselnde Werte auf y draufaddieren, zum 
Beispiel immer eine der ersten hundert Primzahlen, die zu dem Zweck 
reihum aus einem Ringpuffer gezogen wird.

von Frank N. Stein (Gast)


Lesenswert?

Leider erfüllt der Vorschlag nicht das schon mehrfach angesprochene 
Kriterium. Du hast einen inneren Zustand, d.h. du benutzt nicht die Zeit 
allein.

von Jakob (Gast)


Lesenswert?

Stefan (Gast) will:

> y = f(x)
> Wobei y dann die Pseudozufallszahl zum jeweiligen x ist.

> Gibt es eine Formel wie z.B.
> y = (3*x^(x+2)+5*x^(x+4)+7*x^(x+6))/(2*x^(x+1)+4*x^(x+3)+6*x^(x+5))
> die für jedes x eine feste "Zufallszahl" y ausspuckt?

Wie schon oben teilweise erkennbar, gibt es Unmengen von
"Rechenvorschriften" die aus einer Zahl eine andere machen können,
wo der Zusammenhang von Eingabe und Ausgabe nicht leicht erkennbar
ist. In der Sprache C kann man das als eine Function
implementieren, ist also eine Funktion.

Dabei muss man sich aber auf die Bitlänge der Zahl festlegen,
sonst ist es nicht programmierbar.

Wenn du jetzt nur aus jedem Input-Wert eine bunte LED-Ansteuerung
machen willst, bist du mit einem LFSR und NULL-Umgehung schon
gut bedient.
FERTIG.

Wenn du aus der "Zufallszahl" aber auch wieder die Eingabe-
Zahl zurückgewinnen willst, oder eine EINDEUTIGE (!) Zuordnung
von Eingabe zu "Zufallszahl" haben willst, darfs du nicht nach
Zufallszahlen fragen, sondern nach VERSCHLÜSSELUNG.

Dann wird vielleicht auch die Zahl der Schlaumeier-Beiträge
reduziert. ;-)

von Frank K. (fchk)


Lesenswert?

Stefan schrieb:
> Hallo,
>
> weiß jemand, ob es eine mathematische Funktion gibt, mit der man
> Pseudozufallszahlen generieren kann, also eine Funktion in der Form
>
> y = f(x)
>
> Wobei y dann die Pseudozufallszahl zum jeweiligen x ist.

http://apps.nrbook.com/c/index.html

Dann mal Section 7.7 ab Seite 309 lesen...

fchk

von Wie wäre es mit ... (Gast)


Lesenswert?

n(1)=1234567890;
for i=2:1001
n(i) = mod (16807*n(i-1), 2147483647);
i = i+1;
end
n = n / 2147483647;

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Wie wäre es mit ... schrieb:
> n(1)=1234567890;
> for i=2:1001
> n(i) = mod (16807*n(i-1), 2147483647);
> i = i+1;
> end
> n = n / 2147483647;

Der ergibt immer 0 — und zwar eine ziemlich teure.  Im Prinzip ist es 
keine schlechte Idee in einem endlichen Körper zu rechnen (hier GF(M31) 
wobei M31 = 2147483647 = 2^31 - 1 eine Mersennesche Primzahl ist).  Oben 
wurden ja bereits LFSR vorgeschlagen, und mit irreduziblem Polynom ist 
das i.d.R auch "nur" Arithmetik in GF(2^q).

Aber die Berechnung ist zu kompliziert, denn es wurd n * 16807^1000 mod 
M31 berechnet, und K = 16807^1000 kann man auch direkt ausrechnen.  Das 
Verfahren reduziert sich also auf  n -> (K * n) mod M31.

: Bearbeitet durch User
von Unzufallässig (Gast)


Lesenswert?

Kein Thread mit Substring "zufall" im Betreff ist komplett ohne:
https://xkcd.com/221/

von Wosamma Hex Laden (Gast)


Lesenswert?

>> Findest du in der Zahl Pi irgendwo hinterm Komma.
> Mal so ein bisschen abseits vom Thema, ist das eigentlich bewiesen? Es
> könnte ja sein, dass Pi irgendwann zum Beispiel nur noch aus
> 10100100010000 und so weiter besteht. Dann wäre es immer noch
> irrational, würde aber nicht alle Informationen enthalten.

Das ist Pi garantiert in der 0b-Welt.

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.