Erstellen Sie mit C # eine Zufallszahl in einem Bereich


266

Wie mache ich Zufallszahlen innerhalb eines Bereichs?

Antworten:


418

Du kannst es versuchen

Random r = new Random();
int rInt = r.Next(0, 100); //for ints
int range = 100;
double rDouble = r.NextDouble()* range; //for doubles

Schau es dir an

Random Class , Random.Next-Methode (Int32, Int32) und Random.NextDouble-Methode


30
Nur um eine Notiz hinzuzufügen, wenn Sie NextDouble () verwenden und nicht möchten, dass die Untergrenze Null ist. Sie multiplizieren mit der Differenz zwischen der Obergrenze und der Untergrenze und addieren dann die Differenz zwischen der Untergrenze und Null. Also für -1 zu 1 double rDouble = (r.NextDouble()*2)-1.0;
Tom Heard

2
Oder ein vereinfachter Doppelgenerator im Bereich von -1,0 bis 1,0: Double randDoubleY = new Random (). Next (-100, 100) / 100,0D;
BoiseBaked

1
Random()verwendet einen zeitabhängigen Startwert, aber das explizite Ausschreiben ist für die Lesbarkeit besser.
Evgeni Sergeev

44

Versuchen Sie es mit dem folgenden Code.

Random rnd = new Random();
int month = rnd.Next(1, 13); // creates a number between 1 and 12
int dice = rnd.Next(1, 7); // creates a number between 1 and 6
int card = rnd.Next(52); // creates a number between 0 and 51

34

Etwas wie:

var rnd = new Random(DateTime.Now.Millisecond);
int ticks = rnd.Next(0, 3000);

2
für was ist DateTime.Now.Millisecond?
Hille

1
Sie müssen etwas eingeben, damit es mit ...... beginnt. Das Zufallsobjekt berechnet einfach viel für den von Ihnen angegebenen Wert und zwar so, dass jeder Aufruf von Next () für dasselbe Zufallsobjekt resultiert in einem Wert, der dem vorherigen Aufruf ziemlich zufällig entspricht. Um das Ergebnis für verschiedene zufällige Objekte zufälliger zu gestalten , beginnen Sie mit einer anderen Zahl - hier der DateTime.Now.Millisecond. Wenn Sie eine Konstante anstelle eines sich ändernden Werts eingeben, erhalten Sie dieselben Ergebnisse von .Next ().
Mike M

12
Randomist bereits mit einem Systemwert geimpft und Millisecondist nur eine Zahl zwischen 0 und 999. Wenn dieses Zeilenpaar im Code immer zusammen wäre, gäbe es nur 1000 mögliche Werte, da der Startwert rnd.Nextjedes Mal zurückgesetzt wird. Gleicher Samen rein, gleiche Zufallszahl raus. Ich würde den manuellen Samen weglassen.
John McDonald

@ JohnMcDonald, du bist richtig. Um genau zu sein, wird es mit initialisiert Environment.TickCount.
Parag Meshram

11

Verwenden:

Random r = new Random();
 int x= r.Next(10);//Max range

2
Dies gibt keinen Bereich an.
Flügelspieler Sendon

1
Sie machen einfach lower_value + r.Next (10), um einen zufälligen Bereich zu erhalten.
Austin Salgat

6

Wenn Sie für zukünftige Leser eine Zufallszahl in einem Bereich wünschen, verwenden Sie den folgenden Code:

public double GetRandomNumberInRange(double minNumber, double maxNumber)
{
    return new Random().NextDouble() * (maxNumber - minNumber) + minNumber;
}

C # Zufälliges Doppel zwischen min und max

Codebeispiel


2
Die Formel sollte folgendermaßen aussehen:return new Random().NextDouble() * (maxNumber - minNumber) + minNumber;
Frank Sebastià


3

Hier ist die aktualisierte Version von Darrelk Antwort . Es wird mit C # -Erweiterungsmethoden implementiert . Bei jedem Aufruf dieser Methode wird kein Speicher ( new Random () ) zugewiesen .

public static class RandomExtensionMethods
{
    public static double NextDoubleRange(this System.Random random, double minNumber, double maxNumber)
    {
        return random.NextDouble() * (maxNumber - minNumber) + minNumber;
    }
}

Verwendung (stellen Sie sicher, dass Sie den Namespace importieren, der die RandomExtensionMethods-Klasse enthält):

var random = new System.Random();
double rx = random.NextDoubleRange(0.0, 1.0);
double ry = random.NextDoubleRange(0.0f, 1.0f);
double vx = random.NextDoubleRange(-0.005f, 0.005f);
double vy = random.NextDoubleRange(-0.005f, 0.005f);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.