2008-11-17 19 views
8

Używam obiektu System.Random, który jest instancjonowany ze stałym początkiem przez całą aplikację. Wywołuję metodę NextDouble i po upływie pewnego czasu uzyskuję 0,0 jako wynik.System.Random nadal zwraca tę samą wartość

Czy jest jakikolwiek środek zaradczy, czy ktoś inny to napotkał?

EDYCJA: Mam jedno nasiono dla całego przebiegu, który jest ustawiony na 1000 dla dobra sake. Losowe.Następne podwójne jest wywoływane kilkaset tysięcy razy. Jest to aplikacja optymalizująca i może działać przez kilka godzin, ale tak naprawdę dzieje się po 10-0 minutach wykonania. Ostatnio dodałem trochę więcej losowych połączeń do aplikacji.

+0

Czy możesz opracować na "trochę czasu"? Czy mówimy o godzinie lub kilku dniach milionów liczb? Nie wyobrażam sobie, że masz problem z rzeczywistą funkcją, ale jeśli jesteś na terytorium, które nigdy nie było testowane lub planowane, nie odrzucę go od razu. –

+0

możliwy duplikat [Generatora liczb losowych, który generuje tylko jedną liczbę losową] (http://stackoverflow.com/questions/767999/random-number-generator- only- genering-one-random-number) –

Odpowiedz

16

Generator liczb losowych w .NET nie jest bezpieczny dla wątków. Inni deweloperzy zauważyli ten sam problem, i jedno rozwiązanie jest następujący (z http://blogs.msdn.com/brada/archive/2003/08/14/50226.aspx):

class ThreadSafeRandom 
{ 
    private static Random random = new Random(); 

    public static int Next() 
    { 
     lock (random) 
     { 
      return random.Next(); 
     } 
    } 
}
+1

Jest wywoływana z różnych wątków! –

+1

Wygląda na to, że możesz również zastosować atrybut [ThreadStatic] do swojej instancji losowej, jeśli jest to zmienna statyczna w Twojej aplikacji. –

8

Jak często wysiewasz Losowo? Należy to zrobić tylko raz na początku programu.

I raz posiana z podaną wartością, zawsze wygeneruje dokładnie tę samą sekwencję.

+0

Siewam to raz. –

1

spojrzeć na to http://msdn.microsoft.com/en-us/library/system.random.aspx powinien wyjaśnić, dlaczego otrzymujesz tę samą wartość.

+0

Nowa opcja losowa (DateTime.Now.Second) jest ograniczona do 60 odrębnych serii wartości. –

+0

Dlaczego po prostu nie użyć domyślnego konstruktora i pozwolić mu wybrać ziarno? Lepszy pomysł niż ten. – Domenic

+0

yep ok, zmienione na mniej głupie. – Hath

2

Tomas, wpadłem na ten „błąd” i przed rozwiązaniem dla mnie było, aby _rnd zmienną module- poziom:

Private Shared _rnd As System.Random() 
Public Shared Function RandRange(ByVal low As Integer, ByVal high As Integer) As Integer 
    If _rnd Is Nothing Then 
     _rnd = New System.Random() 
    End If 
    Return rnd.Next(low, high) 
End Function 
Powiązane problemy