2011-06-16 15 views
5

Por ejemplo, si tengo una clase:¿Cómo puedo tener dos randoms seguidos para dar valores diferentes?

public class Class 
{ 
public Random r; 

public Class() 
{r= new Random()} 
} 

y más tarde crear dos instancias de ella:

Class a = new Class(); 
Class b = new Class(); 

y llame r secuencialmente, el r tanto para dará los mismos valores. He leído que esto se debe a que el constructor predeterminado para Random utiliza el tiempo para proporcionar "aleatoriedad", por lo que me preguntaba cómo podría evitarlo. ¡Gracias por adelantado!

Respuesta

5

Una forma de lograr eso sería hacer rstatic.

static significa que solo existirá un Random r, y se compartirá en todas las instancias de la clase.

código

Usted se vería así:

public class Class() { static Random r = new Random(); } 

Class a = new Class(); 
Class b = new Class(); 

Si está utilizando roscado, se puede hacer [ThreadStatic] (de modo que cada hilo utiliza su propia instancia de la clase Random)

Hay información sobre cómo usar [ThreadStatic]here - No lo he usado yo mismo, pero parece bastante genial e ingenioso, y se deshace de cualquier problema relacionado con subprocesos.

4

El constructor de la clase Random se basa en el tiempo. Entonces cuando los creas en secuencia rápida, obtienen la misma semilla y luego producen los mismos valores.

Por lo tanto, necesita compartir Aleatorio para sus clases de alguna manera -o-- proporcionar una semilla inicial diferente usted mismo.

2

Una posibilidad en este caso es hacer que el Random sea estático para que solo se cree una instancia una vez.

public class Class{ 
    private static Random r = new Random();   
    //the rest of your class 
} 

El problema es que se crean las dos clases casi al mismo tiempo, por lo tanto, van a utilizar la misma semilla (ya que está basado de la hora actual, entre otras cosas), y producirá la misma secuencia de números .

1

Prueba esto:

public class TestClass 
{ 
    private static int seed = Environment.TickCount; 


    public TestClass() 
    { 
     DoStuff(); 
     DoStuff(); 
     DoStuff(); 
     DoStuff(); 
    } 

    private void DoStuff() 
    { 
     var random = new Random(seed++); 
     int index = random.Next(30) + 1; 

     //Console.Write(index); 
    } 
} 
Cuestiones relacionadas