Frage

Ich möchte eine zufällige Gleitkommazahl zwischen 2 Werten generieren.Was ist der beste Weg, dies in C# zu tun?

War es hilfreich?

Lösung

Das Einzige, was ich hinzufügen würde Erik's Antwort ist eine Erklärung;Meiner Meinung nach ist es besser zu wissen, warum Code funktioniert, als zu wissen, welcher Code funktioniert.

Die Erklärung ist diese:Nehmen wir an, Sie möchten eine Zahl zwischen 2,5 und 4,5.Der Bereich liegt bei 2,0 (4,5 – 2,5). NextDouble Gibt nur eine Zahl zwischen 0 und 1,0 zurück, aber wenn Sie diese mit dem Bereich multiplizieren, erhalten Sie eine Zahl zwischen 0 und Reichweite.

Das würde uns also zufällige Verdoppelungen zwischen 0,0 und 2,0 ergeben:

rng.NextDouble() * 2.0

Aber wir wollen sie zwischen 2,5 und 4,5!Wie machen wir das?Addiere die kleinste Zahl, 2,5:

2.5 + rng.NextDouble() * 2.0

Jetzt erhalten wir eine Zahl zwischen 0,0 und 2,0;Wenn Sie zu jedem dieser Werte 2,5 addieren, sehen wir, dass der Bereich jetzt zwischen 2,5 und 4,5 liegt.

Zuerst dachte ich, es sei wichtig, ob b > a oder a > b, aber wenn man es in beide Richtungen durchrechnet, wird man feststellen, dass es identisch funktioniert, solange man die Reihenfolge der verwendeten Variablen nicht durcheinander bringt.Ich drücke es gerne mit längeren Variablennamen aus, damit ich nicht durcheinander komme:

double NextDouble(Random rng, double min, double max)
{
    return min + (rng.NextDouble() * (max - min));
}

Andere Tipps

System.Random r = new System.Random();

double rnd( double a, double b )
{
   return a + r.NextDouble()*(b-a);
}
// generate a random number starting with 5 and less than 15
Random r = new Random();
int num = r.Next(5, 15);  

Für Doppel können Sie Next durch NextDouble ersetzen

Hier ist ein Ausschnitt, wie man kryographisch sichere Zufallszahlen erhält:Dadurch werden die 8 Bytes mit einer krytografisch starken Folge von Zufallswerten gefüllt.

byte[] salt = new byte[8];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(salt);

Weitere Einzelheiten finden Sie unter Wie zufällig ist Ihr Zufall? (inspiriert von einem CodingHorror-Artikel über das Mischen von Decks)

Wie zufällig?Wenn Sie mit Pseudozufallszahlen umgehen können, dann gehen Sie einfach wie folgt vor:

Random randNum = new Random();
randNum. NextDouble(Min, Max);

Wenn Sie eine „bessere“ Zufallszahl wünschen, sollten Sie sich wahrscheinlich den Mersenne Twister-Algorithmus ansehen.Viele Leute haben habe es bereits umgesetzt aber für dich

Für eine Erklärung, warum Longhorn so stark herabgestuft wurde: http://msdn.microsoft.com/en-us/magazine/cc163367.aspx Suchen Sie nach der Implementierung von NextDouble und der Erklärung, was ein zufälliges Double ist.

Dieser Link ist auch ein gutes Beispiel dafür, wie man kryptografische Zufallszahlen (wie von Sameer erwähnt) nur mit tatsächlich nützlichen Ausgaben anstelle eines Bitstroms verwendet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top