Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zufallsfunktion selbst schreiben... kann jemand helfen? (https://www.delphipraxis.net/29203-zufallsfunktion-selbst-schreiben-kann-jemand-helfen.html)

mojo777 5. Sep 2004 14:52


Zufallsfunktion selbst schreiben... kann jemand helfen?
 
Hallo,

wie funktionieren eigenltich ramdomfunktionen? also ich weiss, dass es in jeder(vernunftigen) Programmiersprache eine Randomfunktion gibt, aber was für eine Idee ist es, die dahinter steckt?

Gruß
Mojo

:coder2:

SleepyMaster 5. Sep 2004 15:18

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
Bin zwar kein Profi dadrin. Hoffe aber ich erklär das richtig:

Es gibt sowas wie eine globale Variable, die am Anfang 0 ist und bei jedem aufruf der Random-funktion um eins erhöht wird. Aus dieser Zahl wird mit einem Algorithmus, der immer möglichst verschiedene Zahlen ausgibt, das random errechnet.
Sieht man auch sehr gut, wenn man diesen Code ausführt:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
Listbox1.Items.Add(inttostr(random(1024)));
end;
Es wird immer rauskommen:

Zitat:

Zitat von Listbox1
0
32
881
207
279
...

Es sei denn, man ruft vorher randomize auf.
Durch randomize wird der globalen Zählerariable ein Wert zugewießen, der anhand von Gettickcount errechnet wird

stefan2005 5. Sep 2004 15:20

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
hi,
also so weit ich weiss hängt das irgendwie mit der Systemzeit ab !
Diese wird ausgelesen und anhand der immer verschiedenen Zeit (vielleicht in Millisekunden oder sogar Takte) eine Zufallszahl generiert !

Aber genau hab ich mich auch noch nicht damit beschäftigt !

cu,
stefan2005

//Edit: Zu spät :wink:

himitsu 5. Sep 2004 16:08

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
So wie es Sleepy erklärt hat kommt es schon hin, allerdings kommt nicht immer diese Zahlenfolge raus - da:

Das mit der Systemzeit stimmt auch nur bedingt, undzwar wird beim Aufruf von Randomize die Systemzeitgenommen und als Startwert an den Zufallsgenerator übergeben
Zitat:

Zitat von Die OH
Randomize initialisiert den integrierten Zufallszahlengenerator mit einem zufälligen Wert (der aus der Systemzeit abgeleitet wird). Der Zufallszahlengenerator sollte initialisiert werden, indem die Prozedur Randomize aufgerufen oder der Variablen RandSeed ein Wert zugewiesen wird.

Mit RandSeed kann man auch einen eigenen Startwert festlegen.

Und Random, RandomRange... errechnen dann den Wert

Also es wird immer wieder die gleiche Zahlenfolge zurückgegeben, aber nicht das ihr das jetzt so einfach hinnehmt, denn
Zitat:

Zitat von Die OH
Hinweis: Die Implementierung der Funktion Random kann sich bei einer anderen Compiler-Version ändern. Sie sollten Random daher nicht für Verschlüsselungen oder andere Einsatzbereiche verwenden, in denen reproduzierbare Pseudozufallszahlen benötigt werden.



Der große Lottogenerator arbeitet deßhalb auch nicht auf diesem Prinzip, da ja so die nächsten Lottozahlen rein theoretisch irgendwann mal vorhergesagt werden könnten - dort wird gewissermasen das nicht vorhersehbare Eigenschwingverhalten von Transistoren gemessen...

Nonsense 5. Sep 2004 18:04

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
Zitat:

Zitat von himitsu
dort wird gewissermasen das nicht vorhersehbare Eigenschwingverhalten von Transistoren gemessen...

Also known as quantenphysikalischer Zufall. :wink:

glkgereon 5. Sep 2004 18:28

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
*kram c-buch raus und übersetz in pascal*

Zitat:

Zufallsfunktion selbst schreiben... kann jemand helfen?
ja ich hab ma sonne art zufallsfunktion rausgesucht:

Delphi-Quellcode:
const
  m=10000000;
  m1=10000;

var
  a:longint;

function mult(p, q:longint):longint;
var p1, p0, q1, q0:longint;
begin
p1:=p/m1;
p0:=p mod m1;
q1:=q/m1;
q0:=q mod m1;
result:= (((p0*q1+p1*q0) mod m1)*m1+p0*q0 mod m;
end;

procedure seedrand(seed:longint);
begin
a:=seed;
end;

function getrandom:longint;
const
  b=pi*10000000;
begin
result:=(mult(a,b) +1 ) mod m;
inc(a);//die zeile is von mir, da man sonst seed immer wieder aufrufen müsste.....
end;
ich hoffe ich hab das richtig übersetzt, da es in besagtem buch als c++-klasse dargestellt war...

Meflin 5. Sep 2004 18:43

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
ps: echte zufallszahlen kannst du z.b. dadurch erhalten, dass du eine zeitlang die mausbewegungen abfängst und aus den koordinaten deine zahl berechnest. ziemlich unmöglich das zu reproduzieren!

glkgereon 5. Sep 2004 18:46

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
trotzdem: es gibt KEINE echten zufallszahlen (jedenfalls nicht in der informatik)

du kannst (theoretisch) ALLES reproduzieren und mit entsprechenden logs genau nachvollziehen, wie es zu dieser zahl gekommen ist..

aber es ist klar das die heutigen methoden gut genug bzw völlig ausreichend sind für die meissten anwendungen....

Meflin 5. Sep 2004 18:49

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
oh doch es gibt auch in der informatik echte zufallszahlen. stell dir vor du fährst mit dem auto über eine buckelpiste, misst die federungsbelastung, nimmst das blöcken einer schafherde auf und berechnest aus diesen werten eine zufallszahl - die ist nicht reproduzierbar!

glkgereon 5. Sep 2004 18:51

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
Zitat:

stell dir vor du fährst mit dem auto über eine buckelpiste, misst die federungsbelastung, nimmst das blöcken einer schafherde auf und berechnest aus diesen werten eine zufallszahl - die ist nicht reproduzierbar!
Zitat:

oh doch es gibt auch in der informatik echte zufallszahlen
was verstehst du unter informatik`? :gruebel: :gruebel: :gruebel:

ich mein also in der informatik erstellte, ohne "reale"/"weltliche" oder was auch immer "inputs"

(wer verstanden hat was ich meine: repekt!)

Chewie 5. Sep 2004 19:03

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
Zitat:

Zitat von Meflin
oh doch es gibt auch in der informatik echte zufallszahlen. stell dir vor du fährst mit dem auto über eine buckelpiste, misst die federungsbelastung, nimmst das blöcken einer schafherde auf und berechnest aus diesen werten eine zufallszahl - die ist nicht reproduzierbar!

Auch das ist theoretisch reproduzierbar. Praktisch mag so etwas scheitern - spielt aber keine Rolle, da es nicht scheitern würde, wenn man die entsprechenden Messgeräte hätte und einen entsprechenden Aufwand betreiben würde.

Echter Zufall gibt es möglicherweise in der Quantenwelt - aber auch hier ist man sich nicht sicher, ob es nicht doch ein Muster gibt, dass wir nur nicht finden können.

Meflin 5. Sep 2004 19:16

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
auch wenn die herstellung nur halbinformatisch ist - trotzdem, mit welchem noch so großem aufwand wilst du bitteschön genau das gleiche schafeblöken herstellen (*g*) wie zum zeitpunkt der "echten" produktion?

glkgereon 5. Sep 2004 19:26

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
ich hab von der echten informatik gesprochen.... :?

klar, so geht das...

dizzy 5. Sep 2004 19:50

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
Es gibt glaube ich auch Karten für PCs die das elektrische Rauschen, dass durch Quanteneffekte auf jeder Leitung existiert, in einen numerischen Wert wandeln und via Treiber verfügbar machen. (Ich glaube zumindest, dass dieser Effekt dafür ausgenutzt wird.)

Ansonsten ist natürlich theoretisch jede "Zufalls"-Folge reproduzierbar. Es reicht aber im allgemeinen die Wahrscheinlichkeit der Reproduzierbarkeit zu minimieren, und mit einer geeignet großen Anzahl an möglichen Startbedingungen ist das ja schon mal nicht schlecht ;)

mojo777 5. Sep 2004 19:54

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
Ahoi,

cool, dass sich so viele von euch dazu geäußert haben...
interessant, wie das problem von einem oder anderen gelöst wird. :-D
also von dem gebiet mit quanten bin ich noch ein stückchen entfernt, finde aber die idee voll toll! :mrgreen:

Gruß

Mojo

writeln 5. Sep 2004 20:20

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
[Senf]

Wenn ich die Uhr meines PCs ablese und dann mit meiner Funkuhr vergleiche, komme ich zu dem Schluß, daß sich erstere wirklich gut eignet, um (nicht reproduzierbare) Zufallszahlen zu erzeugen.
:tongue:

[/Senf]

himitsu 5. Sep 2004 20:22

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
Klar und weil praktisch/theoretisch alles reproduzierbar ist, haben die diesen komischen Lottogenerator extrem abgeschottet (ich weiß aber nicht mehr, wie der heißt und wo er steht)

Also dort ham die die Stromversorung gut getrennt Lampen und Fotozellen und es gibt außer 'ner Signalleitung für Start (Zufallszahlen ausgeben) keine weiteren Eingänge und die Ausgänge sind auch sowas wie Lichtschranken, der genaue Aufbau der Platine für die Zufallswerte ist streng Geheim und der gesamte Bereich um den Rechner steht unter strengster Bewachung, somit ist es "extrem" schwer einen Zufallsalgorithmus dafür zu entwikeln, da ja erst viele Zufallszahlen gesamelt werden müssen, um um einen verwentbaren Algo zu erschafen. Und diesen Rechner zu beeinfluße ist auch sogut wie unmöglich. Womit dieses wohl für 'ne Weile als wirklicher Zufallsgenerator angesehn werden könnte.



Als einfach Variante könnte man z.B. 8, 16 oder 32 Transistoren verwenden (jenachdem, was für 'ne Auflösung man möchte) und diese in Eigenschingung versetzen wenn man jetzt also den Zustand aller Transistoren auf einmal einließt hat man dann schon eine nette Zufallszahl.

flomei 5. Sep 2004 20:59

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
Ich frag mich nur wofür man so genaue "zufällige" Zahlen haben will...

MfG Florian :hi:

Meflin 5. Sep 2004 21:00

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
oh da gibts viele verwendungszwecke, z.B. zur vertraulichen komunikaion mit diffie-hellman falls dir das was sagt

himitsu 6. Sep 2004 07:27

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
Oder für's Glücksspiel und ähnliches - beim Lotto, oder an Automaten sollte es ja möglichst nicht möglich sein die nächstmögliche Kombination zu erraten, bevor sie möglicher Weise auftaucht.

Der "unmögliche" Fall, dass mal jemand die Lösung errechnet sollte ja möglichst unterbunden werden, da es ja sonst für jamanden möglich wäre zu bescheißen....... http://www.fnse.de/S02/0MF.gif

fiasko 6. Sep 2004 07:43

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
Zitat:

Zitat von himitsu
Klar und weil praktisch/theoretisch alles reproduzierbar ist, [...]

Ne, das geht ja aus Gründen der Heisenbergschen Unschärferelation nun mal überhaubt nicht :warn: !

himitsu 6. Sep 2004 07:51

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
Da aber jede Zufallszahl eine gerundeter und in einen bestimmten Bereich gezwengter Wert ist, geht da einiges an "unschärfe" verloren, was bedeutet, das sich alles irgendwann mal wiederholen muß ... und wenn es nur ein paar billionen Jahre dauert

fiasko 6. Sep 2004 07:54

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
Nö, ist schon klar das die Menge der möglichen Zufallszahlen auf einem Rechner abzählbar endlich sind. Trotzdem bleiben die möglichen Kombinationen selbiger unendlich.

himitsu 6. Sep 2004 08:18

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
wenn du 'ne feste Anzahl an Zahlenwerten und auch einen festen Werte bereich hast,
z.B. 6 Werte von 1 bis 49, oder so
dann kann es das Wort unendlich in diesem Zusammenhang nicht geben.

fiasko 6. Sep 2004 08:25

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
OK, dann natürlich nicht. Ein richtiges OS generiert aber meist selber Zufallszahlen und mekrt sich den "RandSeed" über reboot Grenzen, wenn man dann noch einen HW Zufallsgenerator hat dann ist das für CIA- und nicht KGB-Agenten glaubig OK :-).

himitsu 6. Sep 2004 08:31

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
Also bei den heutigen Rechnern ist RandSeed auch nur ein Integer mit schlappen 32 Bit, was ja nicht gerade viel ist und nach nur 4.294.967.296 Werten fängt dieses System ja auch wieder von vorne an.

negaH 6. Sep 2004 08:54

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
Leute, ihr seid Programmierer und arbeitet mit wissenschaftlichen Maschinen und nicht wie Zauberer aus dem Märchenbuch mit nem Zauberstab.

Der RNG in Delphi ist ein LCG und hat eine maximale Periode von 2^32, wenn überhaupt. Somit kann man eine Kette von Zufalls-Bits erzeugen die maximal 2^32/unendlich soviele Bits ohne Wiederholung erzeugt wie es unendlich viele Bits gibt. Nun 2^32/unendlich == 0.000000000000000000000000000000000000000...unendl ich mal 0000000000000000000000..., also in Wahrheit erzeugt der 32Bit LCG aus Delphi gerademal nur 0 Prozent an Zufallsbits aus der Menge der unendlichen Zufallsbits.

Somit ist deine Aussage das exakte Gegenteil von der tatsächlichen Wahrheit.
Man erzeugt also nicht eine unendliche Anzahl von Zufallsbits mit Random(), sondern man erzeugt nur eine verschwindend geringe, ja schon lächerlich geringe Anzahl von Zufallsbits aus der schier unendlich großen Menge aller möglichen Zufallsbits. Will man das mathematisch fast korrekt beziffern so erzeugt Random() fast exakt 0 Zufallsbits aus allen möglichen Zufallsbits.

Gruß Hagen

fiasko 6. Sep 2004 10:22

Re: Zufallsfunktion selbst schreiben... kann jemand helfen?
 
Zitat:

Zitat von himitsu
Also bei den heutigen Rechnern ist RandSeed auch nur ein Integer mit schlappen 32 Bit, was ja nicht gerade viel ist und nach nur 4.294.967.296 Werten fängt dieses System ja auch wieder von vorne an.

ich hab mal ein bißchen nachgelesen. Also der RandSeed wird eigentlich nur zum starten verwendet - denn da läuft die Kiste ohne Nutzerinteraktion und macht meist fast das gleiche - damit dort kein Angriffspunkt entscheid nimmt man den RandSeed.

Später ist das dann nicht mehr wichtig, da ein Entropy-Pool mittels Tastatur, Maus, Interrupt und Blockdevice Zugriffen gefüllt wird und kryptografisch vernünftige Zufallswerte liefern kann.

Aber wir schweifen ab...

Zitat:

Zitat von negaH
Der RNG in Delphi ist ein LCG und hat eine maximale Periode von 2^32, wenn überhaupt. Somit kann man eine

Das ist ja klar, sie 2-3 Postings weiter oben... wir waren nicht mehr so direkt beim verkrüpelten Delphi ZG ;-).

Zitat:

Zitat von negaH
Somit ist deine Aussage das exakte Gegenteil von der tatsächlichen Wahrheit.

Es geht um eine Folge von zufälligen Größen, nicht um eine zufällige Größe und deren Vorraussagbarkeit (der Folge, nicht der Größe) und wie gesagt nicht für den Delphi ZG.


Jetzt ist aber Schluß und morgen gehe ich in die Zauberschule :party:


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz