2011-10-29 11 views
6

Estoy trabajando en un algoritmo de generación de terreno uniforme en C# y utilizando XNA para mostrar los datos.Objeto aleatorio no desechable en C#

Lo hago por lo que crea un nuevo punto a medio camino entre cada punto por iteración, a una altura aleatoria entre los dos. Esto funciona bien, y lo he configurado para que en la segunda iteración elija un punto aleatorio como en la diapositiva dos, en lugar de tratar de crear un nuevo punto entre los puntos que están en el mismo eje.

Lo que ocurre es que el bucle está utilizando el mismo valor aleatorio de la iteración anterior: http://i.stack.imgur.com/UmWr7.png

Esto, obviamente, no es lo ideal, ya que no es una generación aleatoria adecuada.

Si uso un Thread.Sleep(20) después de cada generación punto de que funciona correctamente: http://i.stack.imgur.com/KziOg.png

yo no quiero tener que utilizar la solución Sleep si es posible, ya que es muy lento, y me gustaría utilizar esto en tiempo real. Estoy bastante seguro de que esto tiene algo que ver con el recolector de basura C#.

Aquí es mi punto de obtener el código

Random r = new Random(); 
int x = (p1.X + p2.X)/2; 
int y; 
if (!initial) 
     y = r.Next(Math.Min(p1.Y, p2.Y), Math.Max(p1.Y, p2.Y)); 
else 
     y = r.Next(Math.Min(p1.Y, p2.Y) - Game1.screenHeight/2, Math.Max(p1.Y, p2.Y) + Game1.screenHeight/2); 
return new Point(x, y); 

Es la recolección de basura una parte de la cuestión?

¿Alguna sugerencia o solución para resolver esto?

Respuesta

10

Probablemente esté creando un nuevo objeto Aleatorio en un bucle.

for (/* ... */) { 
    int x = new Random().Next(); // Don't do this! 
    // ... 
} 

Intente crear solo una instancia de Aleatorio al iniciar el programa, luego vuelva a utilizarlo. Si tiene múltiples hilos, entonces podría usar un objeto aleatorio por hilo.

+0

Ahh no puedo creer que no haya visto esto. Muchísimas gracias por la ayuda. – FrenchyNZ

6

Parece que está creando una nueva instancia de Random en cada iteración . Eso tomará su semilla de la hora actual, por lo que sin dormir, terminará con el mismo valor repetidamente; con un sueño terminas obteniendo una semilla diferente.

La respuesta es reutilizar ejemplo unoRandom través de su programa - pero tomando nota del hecho de que Random no es seguro para subprocesos. Si todo su trabajo se realiza en el hilo de la interfaz de usuario, estará bien, pero de lo contrario, puede utilizar uno de los enfoques que he dado en mi article about Random (que habla más sobre este problema).


Y sí, ahora que has publicado el código que es de hecho el caso.

+0

Gracias por la información en Aleatorio no es "hilo-seguro" también muy útil – FrenchyNZ

Cuestiones relacionadas