Utwórz losową liczbę w zakresie za pomocą C #


266

Jak rozpocząć tworzenie liczb losowych w określonym przedziale?

Odpowiedzi:


418

Możesz spróbować

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

Spójrz na

Klasa losowa , metoda Random.Next (Int32, Int32) i metoda Random.NextDouble


30
Wystarczy dodać notatkę, jeśli używasz NextDouble () i nie chcesz, aby dolna granica była równa zero. Mnożysz przez różnicę między górną granicą a dolną granicą, a następnie dodajesz różnicę między dolną granicą a zerem. Tak więc dla -1 do 1 double rDouble = (r.NextDouble()*2)-1.0;
Tom Heard

2
Lub uproszczony podwójny generator w zakresie -1.0 i 1.0: Podwójny randDoubleY = nowy Random (). Dalej (-100, 100) / 100.0D;
BoiseBaked

1
Random()wykorzystuje ziarno zależne od czasu, ale zapisanie tego wprost jest lepsze dla czytelności.
Evgeni Sergeev

44

Wypróbuj poniższy kod.

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

Coś jak:

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

2
za to, co jest DateTime.Now.Millisecond?
Hille

1
Musisz zacząć coś od tego, że ... Losowy obiekt po prostu wykonuje wiele obliczeń matematycznych na podanej wartości i robi to w taki sposób, że każde wywołanie funkcji Next () na tym samym obiekcie losowym spowoduje w wartości dość losowej w stosunku do poprzedniego połączenia. Aby wynik był bardziej losowy w różnych obiektach losowych , zacznij od innej liczby - tutaj DateTime.Now.Millisecond. Jeśli wstawisz stałą, a nie zmieniającą się wartość, uzyskasz takie same wyniki z .Next ().
Mike M

12
Randomjest już zaszczepiony wartością systemową i Millisecondjest tylko liczbą z przedziału od 0 do 999. Gdyby ta para linii była zawsze razem w kodzie, istniałoby tylko 1000 możliwych wartości z rnd.Nextpowodu resetu za każdym razem. To samo ziarno, ta sama liczba losowa. Odstawiłbym ręczne nasiona.
John McDonald,

@JohnMcDonald, masz rację. Mówiąc dokładniej, jest on inicjowany za pomocą Environment.TickCount.
Parag Meshram

11

Posługiwać się:

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

2
To nie określa zakresu.
Winger Sendon,

1
Po prostu wykonaj wartość niższą + wartość r. Dalej (10), aby uzyskać losowy zakres.
Austin Salgat

6

Dla przyszłych czytelników, jeśli chcesz losową liczbę w zakresie, użyj następującego kodu:

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

C # Losowe podwójne od min do maks

Próbka kodu


2
Formuła powinna wyglądać następująco:return new Random().NextDouble() * (maxNumber - minNumber) + minNumber;
Frank Sebastià


3

Oto zaktualizowana wersja z odpowiedzi Darrelka . Jest implementowany przy użyciu metod rozszerzenia C # . Nie przydziela pamięci ( nowy Random () ) za każdym razem, gdy wywoływana jest ta metoda.

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

Sposób użycia (pamiętaj o zaimportowaniu przestrzeni nazw zawierającej klasę RandomExtensionMethods):

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);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.