2011-03-27 16 views
7

Hola
Así como usé el azar pero siempre da el índice "1" a indexOfAChosenListCell.
Cuando depurarlo que muestra valores diferentes, pero en implementaciones regulares recibo el mismo movimiento cada vez que ..
¿Cuál es el problema con Random, que es estática, no al azar ... :)Aleatorio.Siguiente no está dando un número aleatorio

internal Square getAutomaticMove()      
{ 
      List<Square> LegalMovesArray = GetLegalSquares(); 
      Random randomListCell = new Random(); 
      int indexOfAChosenListCell = 0; 

      if (CheckForLegalSquares())  
      { 
       indexOfAChosenListCell = randomListCell.Next(LegalMovesArray.Count-1); 
      } 
+1

Consejo: ¿cuál es el valor de LegalMovesArray.Count-1? Además, mueva la construcción de su Aleatorio fuera getAutomaticMove() –

+0

@Mitch: gracias por su respuesta, pero ¿cuál es el problema con LegalMovesArray.Count-1, quiero arrojar un índice en LegalMovesArray y no tiene un índice whi ch es igual a LegalMovesArray.Count ... – Mulder

Respuesta

4

Sugeriría sembrar el generador de números aleatorios también. Según tengo entendido, terminará con la misma secuencia numérica psuedo aleatoria cada vez que ejecute la aplicación. Puedo estar equivocado.

int Seed = (int)DateTime.Now.Ticks; 
Random randomListCell = new Random(Seed); 
+0

¡Tenía razón! sin sus dos líneas no funciona ... – Mulder

+8

esto no hace la diferencia * en absoluto * - esto es lo que el constructor predeterminado 'new Random()' hace internamente de todos modos. La clave es inicializar 'randomListCell' solo una vez y luego llamar' Next() 'en esta instancia. – BrokenGlass

+0

@BrokenGlass: estoy de acuerdo, que debe crear una variable de instancia y que su respuesta es correcta. No sabía que el constructor predeterminado lo hacía automáticamente. En mi experiencia, he tenido que sembrar. ¿No es por eso que hay un constructor que toma una semilla? Solo estaba agregando a la conversación. – Anx

5

Random.Next(Int32)

devuelve un número aleatorio no negativo menos de la máxima especificada

Así que el número más grande que obtendrá es Count - 2, probablemente no sea lo que quería.

+0

Quiero un número de 0 a tamaño de array-1, lo que significa la última celda – Mulder

+0

@Mulder: Luego debe llamar a 'randomListCell.Next (array.Length)', porque el RNG ya excluirá el valor que usted pasa, no es necesario restar 1. –

4

Declara Random como una variable de miembro privada, ejemplifica el constructor y solo llama a Random.Next en tu método.

3

Su aleatoria debe crear fuera de la función

Random randomListCell = new Random(); 

internal Square getAutomaticMove()      
{ 
      List<Square> LegalMovesArray = GetLegalSquares(); 
      int indexOfAChosenListCell = 0; 

      if (CheckForLegalSquares())  
      { 
       indexOfAChosenListCell = randomListCell.Next(LegalMovesArray.Count-1); 
      } 
21

hacen randomListCell una variable de instancia y sólo inicializarlo vez - de lo contrario seguirá recibiendo los mismos números de nuevo.

De MSDN:

Por defecto, el constructor sin parámetros de la clase Random utiliza el reloj del sistema para generar su valor semilla , mientras que su parametrizado constructor puede tener un valor Int32 basado en el número de marcas en el hora actual. Sin embargo, debido a que el reloj tiene una resolución finita, usando el constructor sin parámetros para crear objetos aleatorios diferentes en rápida sucesión de números aleatorios crea generadores que producen idénticos secuencias de números aleatorios.

3

No cree un nuevo Aleatorio cada vez que necesite un número nuevo; si desea una secuencia de diferentes números aleatorios, desea mantener un único objeto aleatorio y solicitar repetidamente los nuevos.

2

Voy a mostrar la diferencia:

var random = new Random(); 
var color = Color.FromArgb(200, random.Next(255), // 222 
           random.Next(255), // 33 
           random.Next(255)); // 147 

Resultado: # DE2193

var color = Color.FromArgb(200, new Random().Next(255), // 153 
           new Random().Next(255), // 153 
           new Random().Next(255)); // 153 

Resultado: # 999999

0

declaran objeto al azar fuera de la función, de modo que usa el mismo objeto para generar un nuevo número. Que está creando nuevo objeto cada vez que utilizan misma semilla y le da mayormente mismos números ...

static Random randomListCell = new Random(); 
internal Square getAutomaticMove()      
{ 
      List<Square> LegalMovesArray = GetLegalSquares(); 

      int indexOfAChosenListCell = 0; 

      if (CheckForLegalSquares())  
      { 
       indexOfAChosenListCell = randomListCell.Next(LegalMovesArray.Count-1); 
      } 
} 
Cuestiones relacionadas