Einzelnen Beitrag anzeigen
  #10  
Alt 31.03.10, 20:23
Benutzerbild von richy
richy richy ist offline
Singularität
 
Registriert seit: 01.05.2007
Ort: karlsruhe
Beitr?ge: 4.170
Standard AW: kleine numerische Tricks

Zur Abwechslung etwas einfacheres :

IN DER VERTEILUNG PROGRAMMIERBAHRER ZUFALLSGENERATOR
***********************************************

Die Random Algorithmen von Programmiersprachen erzeugen in der Regel gleichverteilte Zufallszahlen. Wie geht man vor, wenn man einen Zufallszahlengenerator benoetigt, der beliebig verteilte Zufallszahlen erzeugt ? Diese Aufgabestellung ist etwas schwieriger als sie zunaechst erscheint. Man kann sie mit Hilfe des aequivalenten Ereignisses loesen.

Die Ziel-Verteilung wird dabei ueber Abtastwerte im Array a[N] vorgegeben.
Im Beispielprogramm ist die Variable j (nach dem break in der for Schleife) die Variable,
die mit der in a[N] gespeicherten Haufigkeit auftritt.
Ein recht nuetzliches Tool.

Hier der Quellcode in Maple:
**********************
# programmierbarer randomgenerator
restart;
with(linalg):
N:=6;
N_go:=5000; # Anzahl Simulationsschritte
z:=rand(1..1000)/1000: # z=Zufallszahl 0..1
for i from 1 to N+1 do b[i]:=0; od: # testfeld

# Vorgabe Wahscheinlichkeit;
a[1]:=1;a[2]:=2;a[3]:=3;a[4]:=4;a[5]:=5;a[6]:=6;

#Normieren
p:=0:
for i from 1 to N do p:=p+a[i]; od:
for i from 1 to N do a[i]:=a[i]/p; od:
# Integrieren #
a[1]:=a[1]; for i from 2 to N do a[i]:=a[i]+a[i-1]; od;

# SIMULATION. Hier werden die Zufallszahlen erzeugt
for i from 1 to N_go do
s:=z(): # s wird die Zufallsfunktion zugeordnet
for j from 1 to N do
if s<=a[j] then break; fi; # s=Zufallszahl
od;
b[j]:=b[j]+1; # Zaehlen ob der Generator funktioniert
od:

# GRAPHISCHE DARSTELLUNG, yepp er funktioniert :-)
druck2:=seq([(i),(b[i])],i=1..N+1):
plot([[druck2]])

Fuer einige spezielle bekannte Verteilungen existieren besondere spezielle Algorithmen.

Ge?ndert von richy (01.04.10 um 05:19 Uhr)
Mit Zitat antworten