2008-11-17 17 views
8

Ich verwende ein System.Random-Objekt, das mit einem festen Seed alle in der Anwendung instanziiert wird. Ich rufe die NextDouble-Methode auf und nach einiger Zeit bekomme ich 0.0 als Ergebnis.System.Random gibt immer den gleichen Wert zurück

Gibt es irgendwelche Abhilfe, hat jemand anderes dies festgestellt?

EDIT: Ich habe einen Samen für den gesamten Lauf, der aus Gründen der Einfachheit auf 1000 eingestellt ist. Das random.NextDouble wird mehrere hunderttausend Mal aufgerufen. Es ist eine Optimierer-Anwendung und könnte für einige Stunden laufen, aber das passiert tatsächlich nach 10-0 Minuten der Ausführung. Ich habe vor kurzem ein paar mehr zufällige Anrufe an die App hinzugefügt.

+0

Können Sie "etwas Zeit" ausarbeiten? Sprechen wir eine Stunde oder mehrere Tage mit Millionen von Zahlen? Ich kann mir nicht vorstellen, dass Sie in der eigentlichen Funktion auf ein Problem gestoßen sind, aber wenn Sie in einem Gebiet sind, das nie getestet oder geplant wurde, werde ich es nicht sofort abwerten. –

+0

mögliches Duplikat von [Zufallsgenerator erzeugt nur eine Zufallszahl] (http://stackoverflow.com/questions/767999/random-number-generator-only-generating-one-random-number) –

Antwort

16

Der Zufallsgenerator in .NET ist nicht threadsicher. Andere Entwickler haben das gleiche Verhalten bemerkt, und eine Lösung ist wie folgt (von 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

Es wird von verschiedenen Threads aufgerufen! –

+1

Es scheint, als könnten Sie das Attribut [ThreadStatic] auch auf Ihre Zufallsinstanz anwenden, wenn es sich um eine statische Variable in Ihrer App handelt. –

8

Wie oft säumen Sie Random? Es sollte nur einmal am Anfang des Programms durchgeführt werden.

Und einmal mit einem gegebenen Wert gesetzt, wird es immer die exakt gleiche Reihenfolge produzieren.

+0

Ich säte es einmal. –

1

Werfen Sie einen Blick auf diese http://msdn.microsoft.com/en-us/library/system.random.aspx sollte es erklären, warum Sie den gleichen Wert bekommen.

+0

Die neue Option Random (DateTime.Now.Second) ist auf 60 verschiedene Werteläufe beschränkt. –

+0

Warum nicht einfach den Standardkonstruktor verwenden und sich einen Seed für Sie aussuchen? Garantiert eine bessere Idee als _these_. – Domenic

+0

yep ok, geändert, um weniger dumm zu sein. – Hath

2

Tomas, ich lief in diese „Fehler“ vor und die Lösung für mich war, um das _rnd Variable Modul- zu machen level:

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 
Verwandte Themen