2011-01-20 9 views

Odpowiedz

9

Po prostu usuń numer początkowy w konstruktorze. Ten materiał siewny jest w zasadzie liczbą, z której generowana jest lista liczb losowych. Jeśli podasz stałą liczbę, twoja lista losowych numerów będzie zawsze taka sama.

Random rand = new Random(); 
rand.Next(); 
+0

będzie ograniczać liczbę wygenerowanych znaków lub może wygenerować 10000 lub 1000000000 – maztt

+0

Nie sądzę, że istnieje limit liczby wygenerowanych liczb. Nie ma również związku z liczbą znaków, ponieważ metoda '.Next()' zwraca 32-bitową liczbę całkowitą ze znakiem większą lub równą zero i mniejszą niż MaxValue. –

4

Nie wiem dokładnie, co jesteś po!

Random rand = new Random(Environment.TickCount); 
rand.Next(); 
+0

+1, podczas gdy rachunek nie jest wielkim ziarnem, to przynajmniej dynamiczny i ogólnie rzecz biorąc prawdopodobnie * wystarczająco dobry *. –

+0

W przyszłości lepiej nie próbować odpowiadać na pytania, gdy, jak mówisz, nie wiesz dokładnie, po co są. – DOK

+0

ok dzięki, wygląda na to, że założyłem to samo co i każdy inny :) – WraithNath

7

Twoje określenie tego samego nasienia spróbuj tego.

Random rand = new Random(); 
rand.Next(); 

Spowoduje to użycie domyślnego materiału siewnego, który jest czasem.

"Inicjuje nowe wystąpienie klasy Losowe, używając domyślnej wartości początkowej zależnej od czasu."

Zgodnie z MSDN: http://msdn.microsoft.com/en-us/library/system.random.aspx

Re komentarzu powyżej, jak wygenerować losowy „numer” w ustalonym zakresie.

// Generate and display 5 random integers from 50 to 100. 
Console.WriteLine("Five random integers between 50 and 100:"); 
Console.Write("{0,8:N0}", rand.Next(50, 101)); 

(Pobrane z powyższego łącza MSDN) Możesz teraz generować żądany zakres.

+0

Istnieje potencjalny problem z używaniem domyślnego materiału siewnego opartego na czasie. W przypadku wielowątkowej aplikacji działającej na procesorze wielordzeniowym stosunkowo prawdopodobne jest, że dwa różne wątki generują dokładnie tę samą wartość losową (ponieważ możliwe jest, aby chwyciły dokładnie ten sam czas systemowy, a tym samym wygenerowały tę samą wartość) . Zamiast tego użyłbym skrótu Guid.NewGuid(). – MusiGenesis

+0

Jeśli taki wniosek został utworzony, to popraw, jednak użycie klasy Random() nie powinno być używane do niczego innego niż sprawianie, by rzeczy wyglądały losowo. – LiamB

+0

Pytanie jest oznaczone jako "asp.net", które jest dokładnie tym rodzajem wielowątkowego środowiska, które może powodować tego typu problemy. Dwóch użytkowników, którzy klikną ten sam kod w tym samym czasie, może zobaczyć te same "losowe" wartości. – LukeH

0
Random rand = new Random(); 
rand.Next(0,1000); // minimum = 0, maximum = 999 
+6

Warto dodać, że minimum zawiera wartość maksymalną. Powyższe wygeneruje liczbę w (włącznie) zakresie 0-999. –

+0

@lain nie wiedział, że ... dobre oko – WernerCD

3
Random rand=new Random(DateTime.Now.Millisecond); 
rand.Next(); 

To zawsze działa na mnie.

+0

Dlaczego nie po prostu 'new Random()', ponieważ używa 'Environment.TickCount' jako domyślnego materiału siewnego? – LukeH

+0

@LukeH: masz jakąś dokumentację na ten temat? Wszystko, co kiedykolwiek widziałem udokumentowane, to to, że jest obsadzone wartością opartą na czasie, co niekoniecznie oznacza, że ​​używa 'Environment.TickCount'. – MusiGenesis

+0

@MusiGenesis: Wydaje mi się, że jest to szczegół implementacji, a nie określona gwarancja, ale można to łatwo potwierdzić za pomocą ILDASM lub Reflectora. Lub robienie czegoś takiego jak 'var r1 = new Random(); var r2 = new Random (Environment.TickCount); while (true) Console.WriteLine (r1.Next() == r2.Next()); 'powinien wyświetlać" true "w sposób ciągły, chyba że * naprawdę * nie ma pecha i dwa konstruktory działają po każdej stronie kleszcza. – LukeH