2008-11-17 18 views
8

Estoy utilizando un objeto System.Random que se crea una instancia con una semilla fija a través de la aplicación. Estoy llamando al método NextDouble y después de un tiempo pasé obteniendo 0.0 como resultado.System.Random sigue devolviendo el mismo valor

¿Hay algún remedio para esto? ¿Alguien más ha encontrado esto?

EDITAR: Tengo una semilla para toda la carrera que se establece en 1000 para mayor conveniencia. El random.NextDouble se llama varios cientos de miles de veces. Es una aplicación optimizadora y podría funcionar durante un par de horas, pero esto realmente sucede después de 10-0 minutos de ejecución. Recientemente agregué un poco más de llamadas aleatorias a la aplicación.

+0

¿Puedes elaborar sobre "algún tiempo"? ¿Estamos hablando de una hora o varios días de millones de números? No creo que te hayas encontrado con un problema en la función real, pero si estás en un territorio que nunca ha sido probado o planificado, no lo descartaré inmediatamente. –

+0

posible duplicado de [Generador de números aleatorios que solo genera un número aleatorio] (http://stackoverflow.com/questions/767999/random-number-generator-only-generating-one-random-number) –

Respuesta

16

El generador de números aleatorios en .NET no es seguro para subprocesos. Otros desarrolladores han notado el mismo comportamiento, y una solución es la siguiente (de 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

¡Se llama desde diferentes hilos! –

+1

Parece que también podría aplicar el atributo [ThreadStatic] a su instancia Aleatoria, si se trata de una variable estática en su aplicación. –

8

¿Con qué frecuencia siembras al azar? Debe hacerse solo una vez al comienzo del programa.

Y una vez sembrado con un valor dado, siempre producirá la misma secuencia exacta.

+0

Lo estoy sembrando una vez. –

1

eche un vistazo a este http://msdn.microsoft.com/en-us/library/system.random.aspx que debe explicar por qué obtiene el mismo valor.

+0

La nueva opción Random (DateTime.Now.Second) está limitada a 60 ejecuciones distintas de valores. –

+0

¿Por qué no usar el constructor predeterminado y dejar que elija una semilla para usted? Garantizado para ser una mejor idea que _los_. – Domenic

+0

sí, bien, cambiado para ser menos estúpido. – Hath

2

Tomas, me encontré con este "error" antes y la solución para mí era hacer que la variable de módulo- _rnd nivel:

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 
2

Otras personas ya han hecho un trabajo decente para explicarlo y proporcionar soluciones.

De todos modos, una pregunta similar ha sido contestada antes de Erik, comprobar que funciona:

Pseudo Random Generator with same output

También obtiene más preguntas y respuestas relacionadas con el tema (generadores de números aleatorios) en:

Stackoverflow.com random-number-generator

génica

P.S. Esto es solo para complementar la respuesta aceptada.

Cuestiones relacionadas