Algo f. exponentialverteilte Zufallszahlen

Moin,

ich suche einen Algorithmus, der mir Zufallszahlen ausspuckt,
die nicht normalverteilt sind.

Ziel:
Ich habe einen Zahlenbereich von 1-10 (natuerliche Zahlen).
Aus diesem moechte ich eine Zufallszahl haben. Jedoch soll
gelten, je groesser die Zahl, desto weniger oft soll sie
gezogen werden.

Ich habe schon Richtung „Exponentialverteilung“ und
„Inverse Transformation“ gesucht, aber das ist mir dann doch
zu mathematisch.

Gibt es vielleicht ein gut erklaertes Programmbeispiel fuer
Nicht-Diplom-Mathematiker wie man sowas erreichen kann?
(vorzugsweise Java oder C(++))

Danke und Gruss
Patrick

Huhu,

Sicher kannst du gleichverteilte Zufallszahlen erzeugen.

Die Potenzen (zB. zur Basis e) dieser Zufallszahlen sind exponentialverteilt. So einfach ist das.

Wenn Du noch möchtest, dass die exp.vert. Zahlen nicht größer sind als 10 (kleine als Null können sie ja nicht sein, weil Potenzen positiver Zahlen (also zB. von e) niemals kleiner als Null sein können), dann müssen die gleichvert. Zahlen maximal bis logbasis(10) gehen, wobei „basis“ die Basis der Potenzen ist. Die Untergrenze kann beliebig sein; je weiter im Negativen, desto steiler ist die Vereilung.

BEISPIEL:

Sagen wir, wir nehmen die Basis e und die Grenzen -1 und ln(10).

In Excel bekommst du ja mit =ZUFALLSZAHL() eine gleichverteilte Zufallszahl zwischen 0 und 1. Zufallszahlen zw. -1 und 10 bekommst du dann mit =(ln(10) - (-1))*ZUFALLSZAHL() + (-1)

Daraus machst du die exp.vert. Zufallszahlen, indem du jede Zahl zur Basis e „hochnimmst“, also =EXP(A1), wenn in A1 eine der gleichvert. Zufallszahlen steht.

Das wars schon. Du kannst die die Verteilung in einem Histogramm ansehen. Ich empfehle dir aber schon so 10000 Werte, damit die Verteilung im Histogramm klar erkennbar wird. Spiel mit der Basis und/oder der Untergrenze, um die Steilheit zu ändern.

Ach ja, für eine beliebige Basis, die in Zelle C1 steht, wäre die Berechnung der gleichvert. Zufallszahlen etwa:

=(ln(10)/ln(C1) - (-1))*ZUFALLSZAHL() + (-1)

und die Berechnung der exp.vert. Zufallszahlen:

=C1^A1

Viel Erfolg!

Jochen

Hallo Patrick,

Ziel:
Ich habe einen Zahlenbereich von 1-10 (natuerliche Zahlen).
Aus diesem moechte ich eine Zufallszahl haben. Jedoch soll
gelten, je groesser die Zahl, desto weniger oft soll sie
gezogen werden.

Die 1 soll also am häufigsten vorkommen, und die 10 dann am seltensten, richtig?.

Das einfachste wäre wohl ein Array, in das Du 10 mal die 1 schreibst, 9 mal die 2, etc.
Dann randomisierst Du den Index mit der „dummen“ rand() von C.
Die Groesse des Arrays kriegst Du faktoriell von 10, also 1 * 10, 2 * 9, etc.
Eventuell verteilst Du die Einsen noch gleichmäßig, sodaß die nicht alle hintereinander in dem Array stehen, muß aber m.E. nicht sein.

lg
Martin B

Hallo Martin,

Die 1 soll also am häufigsten vorkommen, und die 10 dann am
seltensten, richtig?.

Jawohl.

Das einfachste wäre wohl ein Array, in das Du 10 mal die 1
schreibst, 9 mal die 2, etc.
Dann randomisierst Du den Index mit der „dummen“ rand() von C.

Liefert (fuer mich) erstaunlich gute Ergebnisse. Vielen Dank.

Gruss
Patrick

Hallo Jochen,

Das wars schon. Du kannst die die Verteilung in einem
Histogramm ansehen. Ich empfehle dir aber schon so 10000
Werte, damit die Verteilung im Histogramm klar erkennbar wird.
Spiel mit der Basis und/oder der Untergrenze, um die Steilheit
zu ändern.

Keine Ahnung wie man das in Excel macht. Ich versuche es mal
mit Java. Danke fuer deine Erlaeuterungen.

Gruss
Patrick