Entwickler-Ecke

Sonstiges (Delphi) - "Zufall"sgeneratoren - Wie funktionieren sie?


O'rallY - Do 30.01.03 21:22
Titel: "Zufall"sgeneratoren - Wie funktionieren sie?
Wie funktioniert ein Zufallsgenerator bei einem Computer. Einen "Zufall" gibt es bei einer streng logisch rechnenden Maschine ja definitiv nicht, wie also ist die Funktionsweise der Alghorithmen für solche generatoren?


©menschenskind - Fr 31.01.03 14:33

ìch denke, dass das ganz auf die anwendung ankommt...sprich es gibt zum beispiel befehle wie 'randomize' und 'random'..was allerdings dahinter passiert wiß ich net exakt, allerdings implementiert logisches arbeiten net, dass der "computer" auch zufällig arbeiten kann. :shock:


foxy - Fr 31.01.03 15:01

Also Randomize/Random iss denke ich was du suchst .... damit kanns du festlegen, z.B. ein Range vonn 0...100 soll er dir zufallszahlen ausgeben ... oder ähnliches wenn du genauer sagen würdest für welche art von zufall du es brauchst wären wir einen schritt weiter :D


tommie-lie - Fr 31.01.03 15:03

Dafür gibt es mathematische Algorithmen. Teilweise wird das über die Systemzeit berechnet, bzw diese so lange verrechnet, bis man eine schöne einfache Zahl raushat. Professionell wird es über Widerstände gemacht, bzw deren Standardrauschen. Allerdings ist das auch kein vollkommen echter Zufallswert und dieses Verfahren ist sowieso unbrauchbar für Computer. Ich würde also mal nach dem Mathe-Algo googlen, mit dem die Zahlen errechnet werden. Dafür gibt#s bestimmt verschiedene Methoden, also spuckt "algorithmus random" vermutlich jede Menge Stoff aus (Tipp: Versuch TUs zu finden oder sonstige Unis, die Infos sind meist besser und genauer bei solchen Themen als sonstwo).


UGrohne - Fr 31.01.03 18:53

So weit ich weiß, wird das bei Randomize mit der Zahl Pi gemacht, da wird, wenn man die Funktion Randomize aufruft, irgendeine Stelle der Zahl angefangen (abhängig von Systemzeit) und ab dann eben die Zufallszahlen mit diesen Nachkommata eine "Zufallszahl" berechnet.

Gruß


©menschenskind - Fr 31.01.03 19:07

da möchte ich ma ne frage einwerfen!! weiß einer aus wie sich die konstante pi herleiten lässt?! ich meine gehört zu haben, dass es so eine "simple" aufgabe, wie 11/4 oder sowas sein soll! :?: :?:


Raphael O. - Fr 31.01.03 20:29

du kannst sie nicht vollständig durch einen Bruch bestimmen!!!
Pi ist eine irrationale Zahl--> sie ist nicht regelmäßig
um sie zu bestimmen gibts viele Möglichkeiten, die ich allerdings auch nicht kenne... wären aber auch net für den Computer geeignet...
sind eher Versuche, in denen man z.B. Streichhölzer fallen lässt und wenn man das oft genug macht, dann ist die Richtung in die der Kopf zeigt und blablabla jedenfalls kommt da dann irgendwie Pi raus...

Delphi kennt Pi aber auch als "pi" also bracuhst du es gar nicht auszurechnen...
tja ich schweife ab, denn wahrscheinlich weisst du das ja und wolltest nur wissen, wie man es herleitet...

als Bruch kommt 22/7 dem ganzen "ziemlich" nahe:
22/7=3,1429
Pi = 3,1416

Naja genug gelabert :lol: :wink:

hoffe es hat was geholfen... kannst auch mal googeln nach den Methoden...

Fiji-Fighter

P.S. es gibt ganze "Pi-Klubs": eintrittsbedingungen sind z.B. das man Pi auswendig bis auf die 30. Stelle nach dem Komma auswendig wissen muss...


hansa - Fr 31.01.03 20:41

©menschenskind hat folgendes geschrieben:
...weiß einer aus wie sich die konstante pi herleiten lässt?! ich meine gehört zu haben, dass es so eine "simple" aufgabe, wie 11/4 oder sowas sein soll! :?: :?:


Nee, Nee das wäre 2.75 (zugegeben, nicht weit von Pi weg 8) )So einfach geht es wirklich nicht. Pi hat unendlich viele Stellen. Deshalb kann sie nicht genau in einer Zahl mit endlich vielen Stellen dargestellt werden, jedenfalls nicht im Dezimalsystem. Da würden auch 400 Gigabyte Speicher nichts nützen.

Deshalb erhält der Zufallsgenerator seinen Start-Wert aus der Systemzeit.

Gruß
Hansa

P.S.: Mit einem Bruch der nur aus zwei Zahlen besteht, wie 11/4 läßt sich PI nicht bestimmen. Im Computer wird nur eine Näherung berechnet und das aus einer unendlichen Summe von Zahlen, die immer kleiner werden. Und die wird halt irgendwann abgeschnitten. Das gilt übrigens für alle mathem. Funktionen, wie z.B. SIN, COS usw.


tommie-lie - Fr 31.01.03 21:37

Also in der Schule hat man das gelernt:
D * Pi = U (Durchmesser * Pi = Umfang)
Man müsste also nur einen Kreis nehmen, dessen Umfang und Radius ausmessen und dann U/D rechnen, schon hätte man Pi. Zugegeben, die Messungenauigkeiten sind schon ein Problem, aber in etwa richtige Werte kriegt man raus, wenn man sich Mühe gibt.

Aber:
Pi ist ja wohl nicht in die CPU eingebrannt, oder. Sie müsste also jedesmal neu berechnet werden. Dafür gibt's bestimmt irgendwo einen Algorithmus, der das mit beliebiger Genauigkeit und sehr schnell erledigen muss. Den würde ich mir mal im Internet suchen. Oder wie kommt das Pi in den PC?


hansa - Fr 31.01.03 21:41

Zitat:
Oder wie kommt das Pi in den PC?


Als Konstante hinterlegt, wie denn sonst ? Oder glaubst Du, das wird jedesmal neu berechnet ?

Gruß
Hansa


tommie-lie - Fr 31.01.03 21:44

:shock:
Davon bin ich tatsächlich immer ausgegangen.
Wo und von wem wird denn die Konstante implementiert? Kümemrt sich nur das OS darum, oder ist das tatsächlich in der Hardware verankert?


Klabautermann - Fr 31.01.03 21:51

Hallo,

also die Delphi Hilfe spricht Tatsächlich von einer Funktion Pi aus der Unit Systems. Diese bestätigt übrigens was ich in der Schule gelernt habe:
Delphi Hilfe zu Pi hat folgendes geschrieben:
Dieser Wert gibt das Verhältnis zwischen dem Umfang und dem Durchmesser eines Kreises an. Pi hat den Näherungswert 3,1415926535897932385.

Also Pi = U / D.

Wenn man sich die Deklaration suchen lässt (um mal in den Quelltext zu gucken) landet man hier:

Quelltext
1:
2:
3:
4:
5:
6:
unit System; { Predefined constants, types, procedures, }
             { and functions (such as True, Integer, or }
             { Writeln) do not have actual declarations.}
             { Instead they are built into the compiler }
             { and are treated as if they were declared }
             { at the beginning of the System unit.     }

Pi scheint also in den Compiler eingebaut zu sein. Sehr interessant, hilft aber nicht wirklich beim ergünden der Frage "Wie kommt Pi in den Computer".

Gruß
Klabautermann


hansa - Fr 31.01.03 21:58

Das könnte als Funktion so "in den Computer" kommen:


Quelltext
1:
2:
3:
4:
function pi : real;
begin
   pi := 3,1415926535897932385;
end;
8)


Christian S. - Fr 31.01.03 22:23

Hi!

Pi wird am einfachsten (nicht am schnellsten) durch Reihen berechnet. z.B.:

(1/6)*Pi^2 = 1 + 1/(2^2) + 1/(3^2) + 1/(4^2) + 1/(5^2)+...

oder

Pi/4 = 1- 1/3 + 1/5 - 1/7 +-

Es gibt noch viele andere und wahrscheinlich auch einige, die noch besser konvergieren. Wahrscheinlich gibt es sowieso Verfahren, die effizienter sind, aber bisher habe ich nur Reihen gesehen, um Pi mit einem Computer berechnen zu können. (Maple ist beispielsweise ziemlich fix darin, Pi zu berechnen, da kommt bestimmt was anderes zum Einsatz.)

MfG,
Peter


kiwicht - Sa 01.02.03 02:09

und zwar nach folgendem prinzip:

1
11
21
1211
111221
312211
13112221
1113213211
31131211131221
13211311123113112211
11131221133112132113212221
3113112221232112111312211312113211

wer das system raus hat, weiß auch wie pi funktioniert... :? 8)

:P

mfg kiwicht

PS: ehrenwort, da steckt n system hinter!!!


©menschenskind - Sa 01.02.03 11:51

also was ich gelesen hab is, dass man unter verbund verschiedener hochleistungspc konstante pi bis auf 51 MILLARDEN stellen nach dem komma errechnet hat...das zu überbieten, wär doch ma ne aufgabe :mahn:
is quadratut, was wiederum mit dem kreis in verbindung steht möglich?!


matze - Sa 01.02.03 11:57

höhö, wir könnten ja mal hier im AUQ versuchen PI auf soviele stellen wie möglich zu berechnen !!!


tommie-lie - Sa 01.02.03 12:56

Für diese Berechnung gibt's doch schon Distributed Computing Projekte. Genauso wie für das finden von Primzahlen und anderen mathematischen Anomalien. Ganz zu schweigen von den KLlssikern der FFT-Analyse, Krebsheilmittelfindung oder Evolutionsuntersuchungen.
Aber was ich eigentlich meinte, ist, ob Pi in der Hardware, im OS oder dem Compiler. Da diese Frage beantwortet ist, würde sich eine andere Stellen: Gibt's Genauigkeitsunterschiede zwischen Borland, Intel und MS-Compilern, und nebenbei auch noch zwischen den Sprachen (ist Fortran zum Beispiel genauer als BASIC?)?
Es müsste doch eigentlich eine vollkommen standardisierte Zahl sein, die überall gleich ist. Da es aber Compiler von vielen verschiedenen Firmen gibt, wäre das doch sicherlich schwer...


O'rallY - Sa 01.02.03 13:57

Ich kann mir eigentlich nicht vorstellen, dass Pi jedesmal neu berechnet wird. Das wäre viel zu Performancefressend, zumal es eigentlich auch ineffizient ist, eine Zahl, die ja konstant ist, nicht als Variable zu speichern.
Ich könnte mir auch vorstellen, dass verschiede Firmen von Compilern unterschiedliche Pi-Werte haben (vielleicht 5 Nachkommastellen mehr oder so). Ich denke, die Zahl wird einmal auf eine genügend genau berechnet und dann im Compiler irgendwo hinterlegt.
Ich habe mal einen Artikel gelesen, in dem es um eine an einem See gelegene Firma ging, die ihre Passwörter generierten, in dem sie das Plätschern des Wasser aufnahmen. Das brachte mich auf den Gedanken, dass es im Computer bestimmt auch eine Art Geräsch gibt, dass vom "Zufall" abhängt. Ich meine sowas in der Art wie:
tommie-lie hat folgendes geschrieben:

[...] über Widerstände gemacht, bzw deren Standardrauschen.[...]

Wieso ist dieses Verfahren unbrauchbar für den Computer?