Ja.
Random.NextDouble gibt ein Double zwischen 0 und 1 zurück. Dann multiplizieren Sie das mit dem Bereich, in den Sie gehen müssen (Differenz zwischen Maximum und Minimum) und addieren dieses dann zur Basis (Minimum).
public double GetRandomNumber(double minimum, double maximum)
{
Random random = new Random();
return random.NextDouble() * (maximum - minimum) + minimum;
}
Realer Code sollte zufällig ein statisches Mitglied sein. Dies spart die Kosten für die Erstellung des Zufallszahlengenerators und ermöglicht es Ihnen, GetRandomNumber sehr häufig aufzurufen. Da wir bei jedem Anruf ein neues RNG initialisieren, wird das RNG mit genau demselben Zeitstempel gesetzt und generiert denselben Zufallszahlenstrom, wenn Sie schnell genug anrufen, damit sich die Systemzeit zwischen den Anrufen nicht ändert.
public double GetRandomNumber(this Random random, double minimum, double maximum) {...}
Johnny5 schlug vor, eine Erweiterungsmethode zu erstellen. Hier ist ein vollständigeres Codebeispiel, das zeigt, wie Sie dies tun können:
Jetzt können Sie es so aufrufen, als wäre es eine Methode für die
Random
Klasse:Beachten Sie, dass Sie nicht viele neue
Random
Objekte in einer Schleife erstellen sollten, da dies wahrscheinlich dazu führt, dass Sie mehrmals hintereinander denselben Wert erhalten. Wenn Sie viele Zufallszahlen benötigen, erstellen Sie eine Instanz vonRandom
und verwenden Sie sie erneut.quelle
Achtung: Wenn Sie das
random
Innere einer Schleife generieren , wie zum Beispielfor(int i = 0; i < 10; i++)
, setzen Sie dienew Random()
Deklaration nicht in die Schleife.Von MSDN :
Gehen Sie also aufgrund dieser Tatsache wie folgt vor:
Auf diese Weise haben Sie die Garantie, dass Sie unterschiedliche Doppelwerte erhalten.
quelle
Der einfachste Ansatz würde einfach eine Zufallszahl zwischen 0 und der Differenz der beiden Zahlen erzeugen. Fügen Sie dann die kleinere der beiden Zahlen zum Ergebnis hinzu.
quelle
Sie könnten folgenden Code verwenden:
quelle
Sie könnten dies tun:
quelle
Ich bin etwas spät dran, aber ich musste eine allgemeine Lösung implementieren, und es stellte sich heraus, dass keine der Lösungen meine Anforderungen erfüllen kann.
Die akzeptierte Lösung ist gut für kleine Bereiche; jedoch
maximum - minimum
kann es sich unendlich für große Bereiche. Eine korrigierte Version kann also diese Version sein:Dies erzeugt auch zwischen
double.MinValue
und schöne Zufallszahlendouble.MaxValue
. Dies führt jedoch zu einem weiteren "Problem", das in diesem Beitrag gut dargestellt wird : Wenn wir so große Bereiche verwenden, erscheinen die Werte möglicherweise zu "unnatürlich". Zum Beispieldouble.MaxValue
lagen nach der Erzeugung von 10.000 zufälligen Doppelwerten zwischen 0 und allen Werten zwischen 2,9579E + 304 und 1,7976E + 308.Also habe ich auch eine andere Version erstellt, die Zahlen auf einer logarithmischen Skala generiert:
Einige Tests:
Hier sind die sortierten Ergebnisse der Erzeugung von 10.000 zufälligen Doppelzahlen zwischen 0 und
Double.MaxValue
mit beiden Strategien. Die Ergebnisse werden mit logarithmischer Skala angezeigt:Obwohl die linearen Zufallswerte auf den ersten Blick falsch zu sein scheinen, zeigen die Statistiken, dass keiner von ihnen "besser" ist als der andere: Selbst die lineare Strategie hat eine gleichmäßige Verteilung und die durchschnittliche Differenz zwischen den Werten ist bei beiden Strategien ziemlich gleich .
Das Spielen mit verschiedenen Bereichen hat mir gezeigt, dass die lineare Strategie mit einem Bereich zwischen 0 und
ushort.MaxValue
einem "angemessenen" Mindestwert von 10,78294704 "vernünftig" wird (für denulong
Bereich betrug der Mindestwert 3,03518E + 15 ;int
: 353341). Dies sind die gleichen Ergebnisse beider Strategien, die mit unterschiedlichen Maßstäben angezeigt werden:Bearbeiten:
Kürzlich habe ich meine Bibliotheken zu Open Source gemacht. Sie können sich die
RandomExtensions.NextDouble
Methode mit der vollständigen Validierung ansehen .quelle
Was ist, wenn einer der Werte negativ ist? Wäre eine bessere Idee nicht:
quelle
Math.Abs()
ist überflüssig. Da Sie das sichergestellt habenmin >= max
,max - min
muss es dann sowieso eine nicht negative Zahl sein.Wenn Sie eine Zufallszahl im Bereich [
double.MinValue
;double.MaxValue
]]Verwenden Sie stattdessen:
quelle
Wenn Sie dieselbe Zufallszahl in einer Schleife aufrufen möchten, können Sie das neue Random () -Objekt außerhalb der Schleife als globale Variable deklarieren.
Beachten Sie, dass Sie Ihre Instanz der Random-Klasse außerhalb der GetRandomInt-Funktion deklarieren müssen, wenn Sie dies in einer Schleife ausführen möchten.
"Warum ist das?" du fragst.
Nun, die Random-Klasse generiert tatsächlich Pseudozufallszahlen, wobei der „Startwert“ für den Randomizer die Systemzeit ist. Wenn Ihre Schleife ausreichend schnell ist, unterscheidet sich die Systemuhrzeit nicht vom Randomizer, und jede neue Instanz der Random-Klasse beginnt mit demselben Startwert und gibt Ihnen dieselbe Pseudozufallszahl.
Quelle ist hier: http://www.whypad.com/posts/csharp-get-a-random-number-between-x-and-y/412/
quelle
Verwenden Sie einen statischen Zufall, oder die Zahlen wiederholen sich in engen / schnellen Schleifen, da die Systemuhr sie setzt.
Siehe auch: https://docs.microsoft.com/en-us/dotnet/api/system.random?view=netframework-4.8
quelle
quelle