spezielle Zufallszahl

7

Ich hätte gerne eine Zufallszahl wie folgt: (in C #)

%Vor%

Aber es ist wichtig, dass die Zufallszahl näher an 8 ist (oder normalerweise groß ist), Ich meine, wenn wir ein for verwenden:

%Vor%

das Ergebnis ist wie folgt;

%Vor%     
Vahid.m 31.07.2009, 12:09
quelle

6 Antworten

2

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

    
Thomas Levesque 31.07.2009, 12:19
quelle
29

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%     
plinth 31.07.2009 12:14
quelle
2

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.

    
schnaader 31.07.2009 12:19
quelle
1

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.

    
balpha 31.07.2009 12:20
quelle
1

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:

  • Rollen von 4 Würfeln und Ablegen der niedrigsten. Dies verzerrt die Verteilung zu höheren Zahlen.
  • Die Punkte werden eher gemittelt als addiert. Dies macht den Ausgabebereich leichter verständlich.

Alternativ dazu das ist ziemlich nah dran ...

    
Generic Error 31.07.2009 12:36
quelle
0

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 )

    
Mark Embling 31.07.2009 12:16
quelle

Tags und Links