Zufallszahlen: Häufigkeit anpassen für Soll-Durchschnitt
oliver
- programmiertechnik
Ich versuche grade eine Funktion zu schreiben, die eine Zufallszahl (int) innerhalb eines
vorgegebenen Zahlenranges (wird mittels min & max Parametern übergeben) zurückgeben soll.
Als weiterer Parameter wird ein Durchschnittswert übergeben - die zurückgegebene
Zufallszahl soll also durchschnittlich diesem übergebenen Wert entsprechen.
Also etwa so:
[php]
$randval = getRandBetweenMinMaxWithAverage(0, 3, 0.5);
function getRandBetweenMinMaxWithAverage($min, $max, $avg){
//do something
return $randval;
}
[/php]
Wie kann ich jetzt berechnen, wie häufig die einzelnen Werte 0 bis 3 vorkommen müssen
damit der Durchschnittswert 0,5 erreicht wird?
Mir fehlt da irgendwie der mathematische Ansatz um das ausrechnen zu können, da ich
keine Ahnung von Statistik habe.
Was ich brauche, ist also eine Formel, die mir anhand der vorgegebenen Parameter Min,
Max und Soll-Durchschnitt errechnet, das von der Häufigkeitsverteilung her auf eine
Drei x Zweien, y Einsen, und z Nullen kommen müssen um den durchschnittlichen
Erwartungswert von 0,5 zu erreichen.
Noch ein paar Anmerkungen:
Ja, ich habe schon selber darüber nachgedacht, aber keine befriedigende Lösung gefunden -
es geht mir also nicht darum etwas vorgekaut zu bekommen, sondern habe eine Frage, in
der ich nicht weiter komme und mich über jede Hilfe freue!
Bitte keine Links zu statistischen Formeln a la Integral durch Summe von durchs
Knie mal Wurzel durchs Auge durch pi halbe posten, die helfen mir nicht, weil ich
die nichtmals lesen kann!
Sorry für diese Anmerkungen, aber sie scheinen leider nötig zu sein.
Ich habe dieselbe Frage hier gestern schon einmal gestellt, aber leider überwiegend
Antworten die thematisch ziemlich daneben waren und dabei auch noch recht arrogant
rüberkamen, erhalten (einer wollte mich überreden etwas ganz anderes zu machen was mit
meiner Frage sehr wenig zu tun hatte, der nächste hielt sehr kluge Vorträge die
völlig am Thema vorbeigingen...)
Vielen Dank für eure Hilfe!
gruss oliver
hi,
du hast mit https://forum.selfhtml.org/?t=90123&m=540029 bereits einen thread zu diesem thema offen - also bleibe bitte mit weiteren rückfragen auch in diesem.
und lies bitte mal </faq/#Q-11>.
gruß,
wahsaga
hi wahsaga,
vielen Dank für Deinen freundlichen Hinweis!
Hast Du mein Posting überhaupt gelesen?!?
Die Frage ist diesmal _deutlich_ anders gestellt, daher jedenfalls nach meiner Definition _kein_ Doppelposting!
Langsam bekomme ich hier den Eindruck, das es hier nur sehr wenige Leute gibt, die anderen helfen wollen - die meisten scheinen sich hier nur aufzuspielen und wichtig zu machen - sehr schade!
Gibt es hier noch irgendjemanden der was anderes macht als arrogant in der gegend rumzukotzen? Noch habe ich die Hoffnung nicht ganz aufgegeben.
gruss oliver
Gibt es hier noch irgendjemanden der was anderes macht als arrogant in der gegend rumzukotzen? Noch habe ich die Hoffnung nicht ganz aufgegeben.
Ja ... mich :)
hi,
Hast Du mein Posting überhaupt gelesen?!?
ja.
Die Frage ist diesmal _deutlich_ anders gestellt, daher jedenfalls nach meiner Definition _kein_ Doppelposting!
es ist trotzdem immer noch die selbe _thematik_!
du hast sie natürlich noch um ein paar "anmerkungen" erweitert - aber die hättest du dir auch besser sparen können.
dass du dich wohl ein wenig in die komplexe materie der statistik und wahrscheinlichkeitsrechnung wirst einarbeiten müssen, wurde dir gestern bereits gesagt - warum kommst du jetzt mit der "anmerkung", dass du sowas nicht hören willst?
und
- Sorry für diese Anmerkungen, aber sie scheinen leider nötig zu sein.
Ich habe dieselbe Frage hier gestern schon einmal gestellt, aber leider überwiegend
Antworten die thematisch ziemlich daneben waren und dabei auch noch recht arrogant
rüberkamen, erhalten
halte ich ehrlich gesagt für eine große frechheit gegenüber allen, die sich auf deine erste frage hin schon bemüht haben, dir zu antworten, dir zusammenhänge zu erklären, etc.
Langsam bekomme ich hier den Eindruck, das es hier nur sehr wenige Leute gibt, die anderen helfen wollen - die meisten scheinen sich hier nur aufzuspielen und wichtig zu machen - sehr schade!
Gibt es hier noch irgendjemanden der was anderes macht als arrogant in der gegend rumzukotzen?
du fällst jedenfalls zur zeit noch in genau diese schublade - missachtest die FAQ, und schreibst "anmerkungen", die allen bisherigen antwortern bescheinigen, "ihr seid alle scheiße, weil ihr nicht das geantwortet habt, was ich hören wollte" - un blökst dann hier auch noch weiterhin so rum.
bitteschön, du hast es dir verdient:

gruß,
wahsaga
Hi,
Bei Lessing steht:
Wär auch ein böser Mensch gleich einer lecken Bütte,
Die keine Wohltat hält: dem ungeachtet schütte
Sind beides, Bütt und Mensch nicht allzu morsch und alt,
Nur deine Wohltat ein. Wie leicht verquillt ein Spalt!
Also gut ... ;-)
Was ich brauche, ist also eine Formel, die mir anhand der vorgegebenen Parameter Min,
Max und Soll-Durchschnitt errechnet, das von der Häufigkeitsverteilung her auf eine
Drei x Zweien, y Einsen, und z Nullen kommen müssen um den durchschnittlichen
Erwartungswert von 0,5 zu erreichen.
Die hast Du bekommen, kannst sie aber nicht lesen.
Aber davon lassen wir uns ja nicht abhalten ;-)
Du kannst es, wie von Dir schon einmal angedacht, mit Brute Force versuchen, also mit Gewalt. Ich erlaube mir mal, Dein Beispiel zu nutzen.
Die Mengen 3,2,1 und 0 haben eine zufällige Mächtigkeit, die zudem auch noch untereinander unabhängig ist. Auf deutsch: Du füllst 4 Speicher aus dem Zufallstopf, nach einer gewissen, frei bestimmbaren Zeit ist etwas in den 4 Speichern drin enthalten (oder auch nicht. Ist ja zufällig). Daraus ziehst Du dann den Durchschnitt (Was für einen Durchschnitt ist nicht ganz klar, dürfte aber wohl der arithmetische sein, ist aber auch vollkommen egal). Unter Beachtung der Fallen bei der Fließkommaberechnung schaust Du nach, ob das Ergebnis dieser Durchschnittsberechnung Deinem Wunsch - hier: 0,5 - nahe genug kommt. Ist das nicht der Fall hast Du vier Möglichkeiten:
Die letzte Möglichkeit dürfte Dir hier wohl zusagen nehme ich an. Ist einfach zu implementieren und trotzdem recht flott. Der Preis dafür ist ein gewisser Verlust an Entropie; mußt Du selber wissen, ob Du das verschmerzen kannst. Aber die Wichtung selber dürfte diesen Nachteil eh schon in die Nichtigkeit schieben.
So, mehr fällt mir aber wirklich nicht mehr ein, denn Du hast es erklärt bekommen, fertigen Code (Wenn auch kein PHP), Hinweise zum Selberlernen, die richtige Formel und eine vereinfachte für die Implementation und jetzt auch noch einen weighted Bogorand.
Was noch? Soll ich es machen? Kein Problem: 3 EUR/Zeile (dürften ca 20-30 Zeilen werden, je nach PHP-Version). Vorkasse.
so short
Christoph Zurnieden
Hi Christoph,
ich danke Dir für Deine Antwort!
es ist die erste konstruktive Antwort mit der ich auch was anfangen kann, wenn Du Dir auch das Lessingzitat mitsamt deines Zynismus hättest sparen können.
Die von dir aufgeführten Lösungsansätze sind mir nach einiger Grübelei auch schon in den Sinn gekommen, u.a. auch einer der noch ein wenig effektiver sein dürfte als die angeführten.
(Errechnung der Differenz von Durchschnitt vorher und dem Solldurchschnitt, anschliessend Zerlegung des Zahlenrange in aufeinander folgende überlappende Wertepaare, dann die Häufigkeitsverteilung je Wertepaar um einen bestimmten Prozentsatz ändern, wobei sich dieser Prozentsatz aus der Elementmenge errechnet und je nachdem ob soll- oder ist-avg grösser ist, ein positives oder negatives vorzeichen hat...)
Wie dem auch sei: Das ist _nicht_ das was ich suche!
Ich suche eine elegante, saubere Lösung für eine ganz klare mathematische Aufgabenstellung - kein Rumprobieren mit ungewisser Effizienz und irgendwelchen Näherungswerten als Ergebnis.
gruss oliver
Hallo oliver,
also langsam glaube ich, du moechtest gar nicht lernen, sondern einen Code-Batzen
vorgesetzt bekommen. Tja, dann geh googeln. Hier bist du falsch.
Grüße,
CK
Ich suche eine elegante, saubere Lösung für eine ganz klare mathematische Aufgabenstellung
Die Aufgabenstellung ist alles andere als klar. Du gibst ledigldich den Bereich und den Mittelwert an, sagst aber nichts über die Verteilungsfunktion.
Also befragen wir mal die Glaskugel - oder auch nicht, weil dein Verhalten nicht darauf hindeutet, dass du hier Antworten bekommen willst/solltest.
Gunnar
Hi,
ich danke Dir für Deine Antwort!
es ist die erste konstruktive Antwort mit der ich auch was anfangen kann, wenn Du Dir auch das Lessingzitat mitsamt deines Zynismus hättest sparen können.
Rein zur Übung nur bin ich so bissig, auf das ich dereinst nicht ungeschickt in's Gras beiße.
Die von dir aufgeführten Lösungsansätze sind mir nach einiger Grübelei auch schon in den Sinn gekommen, u.a. auch einer der noch ein wenig effektiver sein dürfte als die angeführten.
Es dürfte so einiges effektiver als Brute Force sein.
(Errechnung der Differenz von Durchschnitt vorher und dem Solldurchschnitt, anschliessend Zerlegung des Zahlenrange in aufeinander folgende überlappende Wertepaare, dann die Häufigkeitsverteilung je Wertepaar um einen bestimmten Prozentsatz ändern, wobei sich dieser Prozentsatz aus der Elementmenge errechnet und je nachdem ob soll- oder ist-avg grösser ist, ein positives oder negatives vorzeichen hat...)
Wenn ich Dich jetzt richtig verstanden habe ist das O(n^3). Klar, das Du da etwas effektiveres suchst.
Wie dem auch sei: Das ist _nicht_ das was ich suche!
Ich suche eine elegante, saubere Lösung für eine ganz klare mathematische Aufgabenstellung - kein Rumprobieren mit ungewisser Effizienz und irgendwelchen Näherungswerten als Ergebnis.
Was ist schlecht an "gut genug"? Mit "gut genug" hat MS über 60 Milliarden Dollar auf die hohe Kante legen können und hat es sogar zum Monopolisten geschafft!
Aber ich schweife ab. Was mich an Deinem letztem Absatz wundert ist der Wunsch nach einer "klaren, eleganten Lösung", denn davon wurden Dir zwei verschiedene angeboten. Die eine reguläre wolltest Du nicht, da Du sie nicht verstanden hast. Das ist kein Problem, denn eine allgemeine Lösung für ein spezielles Problem ist in diesem Fall ja auch unnötig.
Was ist denn mit meiner Lösung? Nein, nicht die Brute Force Methode von eben, sondern die Methode einfach das erstbeste Minimum zu nehmen?
Aber was ist überhaupt mit der Brute Force Methode? Die hat O(n+m). Nur die Größe von m ist umso unbekannter, je "zufälliger" das Ergebniss sein soll (Überschreitet aber nie n+|(min,max)|, Best Case ist sogar m=0. Ganz so schlecht ist Brute Force hier also ganz und gar nicht). Das ist sie aber immer und genau da liegt das Problem, das Du vielleicht noch gar nicht erkannt hast. Die ganze Komplexität, die - ich erlaube mir hier einmal den Plural - wir darin sehen liegt einzig und alleine daran, das das Ergebnis so zufällig wie möglich sein soll, der alleinige deterministische Part die Wichtung. Das ist der Punkt, an dem die ganze Sache so schwierig wird.
Je mehr Abstriche Du an die Bedingung Zufälligkeit machst, desto einfacher wird es. Bis hinunter zur Minimummethode, die gänzlich deterministisch ist, aber nach außen hin durchaus zufällig aussieht. Bis auf die Wichtung natürlich.
Wie Du siehst, ist die Effizienz sogar sehr genau berechenbar - pardon: gewiss und Näherungswerte liegen in der Natur der Sache, die nun einmal "Zufall" ist.
so short
Christoph Zurnieden
es ist die erste konstruktive Antwort mit der ich auch was anfangen kann, wenn Du Dir auch das Lessingzitat mitsamt deines Zynismus hättest sparen können.
Ich weiß gar nicht warum überhaupt jemand noch so einem arroganten Typ antwortet. Er bekommt Antworten noch und nöcher, dann beleidigt er alle die ihm geantwortet hat:
Zitat:
- Sorry für diese Anmerkungen, aber sie scheinen leider nötig zu sein.
Ich habe dieselbe Frage hier gestern schon einmal gestellt, aber leider überwiegend Antworten die thematisch ziemlich daneben waren und dabei auch noch recht arrogant rüberkamen, erhalten (einer wollte mich überreden etwas ganz anderes zu machen was mit meiner Frage sehr wenig zu tun hatte, der nächste hielt sehr kluge Vorträge die völlig am Thema vorbeigingen...)
Ich hab hier https://forum.selfhtml.org/?t=90123&m=540029 nichts gelesen das auf diese Aussage zutrifftt. Im gegenteil da wurde mir einer Engelsgeduld ihm ausführlich, mit Links und Beispielen versucht zu helfen. Und nirgendwo ein Ansatz wo man sieht das er etwas tut. Immer nur, "das ist nicht das was ich will"
Ich hab hier ja schon einiges an ausratern erleben dürfen, meistens waren das Menschen die zwar dumm sind aber glauben sie hätten die weisheit mit dem Löffeln gespeist und auf jeden Versuch ihnen mal eine andere Sichtweise ihrer Probleme nahezulegen, sofort rot sehen.
Aber der hier ist die Krönung an Arroganz und Ignoranz gegenüber Menschen die ihm helfen wollen und sich dabei sehr viel Mühe geben.
Zum Glück kann ich nichts zum Thema sagen
Struppi.
Hallo,
Ich weiß gar nicht warum überhaupt jemand noch so einem arroganten Typ antwortet. Er bekommt Antworten noch und nöcher, dann beleidigt er alle die ihm geantwortet hat:
ich hatte jetzt einfach mal "Spaß" an der Thematik
an sich, und immerhin lesen ja noch andere potenziell
interessierte Forumsteilnehmer mit. Daher würde ich das
ganze mal etwas losgelöster von "Menscheleien" sehen...
Viele Grüße
Andreas
Hallo,
Also etwa so:
[php]
$randval = getRandBetweenMinMaxWithAverage(0, 3, 0.5);function getRandBetweenMinMaxWithAverage($min, $max, $avg){
//do something
return $randval;
}
[/php]Wie kann ich jetzt berechnen, wie häufig die einzelnen Werte 0 bis 3 vorkommen müssen
damit der Durchschnittswert 0,5 erreicht wird?
Du brauchst zunächst mal eine Verteilungsfunktion f(x)
für x-Werte zwischen 0 und 3. Diese muss folgende
Bedingungen erfüllen:
a) Das Integral zwischen x=0...3 über f(x) muss 1 ergeben (Normierung).
b) Das Integral von x*f(x) zwischen 0..3 soll 0.5 ergeben,
das ist dann der gewünschte Schwerpunkt der Verteilung.
Da es beliebig viele Möglichkeiten gibt, sich eine
Funktion für x=0...3 auszudenken, nimmt man einen
sinnvoll aussehenden Ansatz mit einer überschaubaren
Anzahl von Variablen, z. B.
f(x) = A*exp(-B*x)
Diese Funktion hat den Vorteil, dass sie im unteren
Bereich von 0...3 die größeren Werte hat (für positive A,B),
so dass der Schwerpunkt ebenfalls im unteren Bereich liegen sollte.
Die Bedingungen a) und b) führen leider
auf Gleichungen, die nur numerisch lösbar sind.
Falls Du stattdessen einen Polynom-Ansatz
nimmst, geht es evtl. besser.
Für das Intervall [0..3] und den Schwerpunkt 0.5
zeige ich mal folgendes Beispiel per cut&paste
(allerdings nicht in PHP...):
=====8><==========================================================
$ cat verteilung.r
#!/usr/local/bin/rvm
float x=3,
A=1, B=1,
f->A*exp(-B*x), # Verteilungsfunktion
F->A/B * (1-exp(-B*x)), # Normierung
M->-A/B*x*exp(-B*x) + A/B^2*(1-exp(-B*x)); # Schwerpunkts-
# Integral
Fit_MRQ X = {
parameters->[A,B];
equations = [
{ left -> F; right -> 1; }, # Norm soll 1 ergeben
{ left -> M; right -> 0.5; } # Schwerpunkt soll 0.5 ergeben
];
};
out "A = $X.A, B = $X.B\n";
$ rvm verteilung.r
A = 1.97306, B = 1.96767
=====8><==========================================================
Mit diesen Werten musst Du nun die Stammfunktion
F(x) = A/B*(1-exp(-B*x)) nehmen, diese mit einer
Zufallsfunktion random() gleichsetzen, die zwischen
0...1 gleichverteilt ist und das ganze nach x auflösen.
Ich komme auf folgendes Ziehungsverfahren (ohne Gewähr...):
x = -1/B * ln(1-B*random()/A)
Mit obigen Parametern für A und B liegen die
gezogenen X-Werte dann zwischen 0...3 und haben
den Schwerpunkt 0.5 - vorausgesetzt, dass der
Zufallsgenerator in random() gleichverteilte
Zahlen zwischen 0...1 liefert.
Viele Grüße
Andreas Pflug
Hallo,
Noch mal einen anderen Lösungsansatz, weil das Problem interessant ist:
Erst mal eine Zusammenfassung der Anforderungen, die im Laufe der beiden Threads genannt wurden.
Man kann nun einfach die Häufigkeit aller Werte, die kleiner als der Mittelwert sind erniedrigen und die aller Werte, die größer als der Mittelwert sind, erhöhen.
Berechnung der Wahrscheinlichkeiten:
sum_a = summe aller Werte, die kleiner als der Mittelwert sind.
sum_b = summe aller Werte, die größer als der Mittelwert sind.
wahr_a = Wahrscheinlichkeit, dass ein Wert gewählt wird, der größer als der Mittelwert ist
wahr_b = Wahrscheinlichkeit, dass ein Wert gewählt wird, der kleiner als der Mittelwert ist. Wobei wahr_b = 1 - wahr_a;
Gelten muss:
(sum_a * wahr_a + sum_b * (1 - wahr_a)) / (b - a + 1) = m
Nun das Ganze nach wahr_a auflösen:
wahr_a = (m *(b - a + 1) - sum_b) / (sum_a - sum_b)
Falls der Mittelwert eine ganze Zahl ist, wird diesem natürlich keine Wahrscheinlichkeit zugeordnet. Diese ist ja beliebig Wählbar (z.b. als 1 / (b -a + 1)) und die Wahrscheinlichkeiten wahr_a und wahr_b sind dann entsprechend zu korrigieren.
Mit Hilfe einer Funktion die zufällig Fließkommazahlen zwischen einschließlich 0 und 1 liefert, kann man dann entscheiden, ob als nächstes ein Wert kleiner, gleich oder größer als der Mittelwert zurück gegeben werden soll.
Grüße
Daniel