2011-11-04 12 views
5

Tengo una función recursiva, y dentro de la función se selecciona un elemento aleatorio de una matriz, pero no importa lo que haga, sigo obteniendo la misma semilla.Función recursiva de semilla aleatoria. ¿Cómo lo hago?

static Random rand = new Random(); 
public String spintaxParser(String s) 
    { 
     if (s.Contains('{')) 
     { 
      int closingBracePosition = s.IndexOf('}'); 
      int openingBracePosition = closingBracePosition; 

      while (!s[openingBracePosition].Equals('{')) 
       openingBracePosition--; 

      String spintaxBlock = s.Substring(openingBracePosition, closingBracePosition - openingBracePosition + 1); 

      String[] items = spintaxBlock.Substring(1, spintaxBlock.Length - 2).Split('|'); 


      s = s.Replace(spintaxBlock, items[rand.Next(items.Length)]); 

      return spintaxParser(s); 
     } 
     else 
     { 
      return s; 
     } 
    } 

¿Cuál es la mejor manera de manejar al azar en una función recursiva?

+2

¿Tiene algún código? –

+0

¿Has intentado buscar una respuesta a esto? Hay tantas preguntas sobre el uso de Random, por ejemplo, http://stackoverflow.com/questions/4855756/random-number-generation-same-number-returned (que a su vez se refiere a otras preguntas relacionadas). – AAT

+0

Necesitaremos un código fuente para realmente poder ayudar. –

Respuesta

3

Declare una instancia única (estática) del objeto Random fuera del alcance de su función recursiva, luego invoque la instancia desde el interior de su función recursiva.

El constructor por defecto de Random sembrará automáticamente con la fecha y hora actual, por lo que está recibiendo los mismos valores una y otra vez porque estás constantemente crear una nueva instancia del objeto Random.

Editar: Además, podría probar esto, aunque definitivamente no es ideal. Preferiría una única instancia Random o una semilla estática sobre este método.

Random r = new Random(Guid.NewGuid().GetHashCode()); 
+0

¿sería posible crear una nueva instancia de la clase aleatoria dentro de la función recursiva y pasar una marca de tiempo? –

+0

@SianJakeyEllis podría crear una semilla global (estática) y reutilizarla en el constructor al crear sus objetos aleatorios. Sin embargo, eso es probablemente un poco menos que la eficiencia ideal. –

2

Ayudaría si publicaras el código. Pero en ausencia de eso, voy a usar mis poderes psíquicos y supongo que está utilizando un patrón de esta manera

void MyRecursiveFunction() { 
    var index=new Random().Next(...); 
    ... 
} 

Si es cierto, la solución es cambiar su código para que lo haga "nueva aleatorio()" solo una vez y lo pasa (o lo almacena en alguna variable de instancia apropiada) en lugar de construir uno nuevo cada vez.

1

Pase el Random como parámetro a la función recursiva y use la instancia pasada para obtener el siguiente valor cada vez.

public void Recurse(object param, Random rand) 
{ 

    ... 
    var val = rand.Next(); 
    //use the value ... 
    Recurse(obj, rand); 
} 

Recurse(arg, new Random()); 

Obviamente, la recursividad tocará fondo de alguna manera, pero esto demuestra el principio.

0

Sugiero que incluya el objeto aleatorio en la función recursiva. Esta prueba debería demostrar que no siempre obtendrás el mismo int.

[Test] 
    public void TestSpintaxRandom() 
    { 
     spintaxParser("{|||{|||{|||{|||{|||{|||{|||{|||}}}}}}}}", new Random()); 
    } 

    public String spintaxParser(String s, Random r) 
    { 
     if (s.Contains('{')) 
     { 
      var closingBracePosition = s.IndexOf('}'); 
      var openingBracePosition = closingBracePosition; 

      while (!s[openingBracePosition].Equals('{')) 
       openingBracePosition--; 

      var spintaxBlock = s.Substring(openingBracePosition, closingBracePosition - openingBracePosition + 1); 
      var items = spintaxBlock.Substring(1, spintaxBlock.Length - 2).Split('|'); 

      var next = r.Next(items.Length); 
      Console.WriteLine(next); 
      s = s.Replace(spintaxBlock, items[next]); 

      return spintaxParser(s, r); 
     } 

     return s; 
    } 
Cuestiones relacionadas