Sie benötigen eine Verteilungsfunktion, die eine Zahl zwischen 0 und 1 annimmt und sie in eine Zahl im gewünschten Bereich umwandelt, mit einer höheren Gewichtung für eine bestimmte Zahl. Sie könnten eine solche Funktion mit trigonometrischen Funktionen (sin, cos, ...), exponentiell oder vielleicht einem Polynom erstellen.
UPDATE: Sehen Sie sich diese Seite für weitere Informationen zur Wahrscheinlichkeitsverteilung an
Sie müssen Ihre Ergebnisse gewichten. Sie können das mit etwas wie diesem tun:
%Vor%Wenn ich wüsste, dass meine Reichweite klein und konsistent ist, würde ich die Tabelle verwenden - es ist trivial, sie zu einer eigenen Klasse zu machen.
Der Vollständigkeit halber füge ich auch diese Klasse hinzu. Diese Klasse lehnt sich an die Bildverarbeitung an und verwendet die Gammakorrekturfunktion: ein Wert zwischen 0 und 1 erhöht auf Gamma, der einen Wert zwischen 0 und 1 zurückgibt, aber mehr verteilt das untere Ende, wenn Gamma & lt; 1,0 und mehr zum oberen Ende, wenn Gamma & gt; 1.0.
%Vor%(aus Kommentaren, r aus GetWeightedRandom () entfernt. Auch Bereichsüberprüfung zu Next ()) hinzugefügt
Okay, lass uns hier wirklich in die Stadt gehen. Ich kan John Skeet dafür kanalisieren - es ist eine abstrakte Klasse mit einer Template-Eigenschaft, die eine Transformationsfunktion zurückgibt, die den Bereich [0..1) auf [0..1] abbildet und die Zufallszahl auf diesen Bereich skaliert. Ich habe auch Gamma in Bezug darauf neu implementiert und auch Sin und Cos implementiert.
%Vor%Anstatt die Array-Variante zu verwenden, können Sie sich auch diese SO-Antwort ansehen, die ein Link zu Math.NET Iridium , das nicht-einheitliche Zufallsgeneratoren implementiert.
Die Vorteile der Array-Variante bestehen darin, dass Sie einen dynamischeren Ansatz erhalten, ohne das Array ständig neu schreiben zu müssen. Sie könnten auch einige Dinge tun, die mit der Array-Variante (große uneinheitliche Zufallszahlen) praktisch unmöglich wären.
Mit einer gewissen zusätzlichen Gewichtung sollte das möglich sein. Hängt davon ab, wie Sie "nahe acht" angeben. Ein sehr einfacher Weg, dies zu tun, ist dies:
%Vor% Bei der Quadratur werden die Zahlen zum unteren Ende gewichtet, dh in diesem Fall erhalten Sie in 33% der Fälle eine 0
, während Sie in nur 5% der Fälle eine 9
erhalten.
Diese Methode wird natürlich dem jeweiligen Fall angepasst.
Nicht genau das, wonach Sie suchen, aber eine sehr einfache Möglichkeit, eine normale Verteilung von Zahlen zu approximieren, ist das Hinzufügen mehrerer Generationen.
Ein klassisches Beispiel für diese Technik ist das Spiel Dungeons and Dragons, bei dem die Stärke eines Charakters bestimmt werden kann, indem drei sechsseitige Würfel gerollt und die Ergebnisse hinzugefügt werden. Dies ergibt einen Bereich von 3 bis 18 mit Zahlen um 10 am wahrscheinlichsten. Varianten umfassen:
Alternativ dazu das ist ziemlich nah dran ...
Es sieht für mich so aus, als wollten Sie, dass Ihre Zufallszahlen in Richtung High-End gewichtet werden - wäre das eine faire Einschätzung?
Etwas wie das kann Ihnen helfen (es ist Java, aber die Prinzipien gelten )