2010-07-10 10 views
5

Estoy trabajando en Pong en C# w/XNA.¿Cómo uso números aleatorios en C#?

Quiero usar un número aleatorio (dentro de un rango) para determinar cosas tales como si la pelota rebota en línea recta, o en ángulo, y qué tan rápido se mueve la pelota cuando golpea una paleta.

Quiero saber cómo implementarlo.

+10

No debería el ángulo y la velocidad serán determinados por la forma en la pelota golpea la barra? Si lo haces al azar, parece que a tus usuarios les costará anticipar hacia dónde va la pelota. –

+1

@Esteban ¡No si es Xtreme Pong! – Grokodile

+0

En su estado actual, la pelota rebota dependiendo de si la paleta se mueve o no cuando golpea. Pero si ninguna de las palas se movía, la bola se iría recta sin variación. Quería usar un número aleatorio para cambiar el ángulo. – Slateboard

Respuesta

14

Utilice la clase Random. Por ejemplo:

Random r = new Random(); 
int nextValue = r.Next(0, 100); // Returns a random number from 0-99 
+3

Vale la pena señalar que solo debe crear una * instancia única * de Aleatorio (por subproceso). Para juegos simples de un solo subproceso, lo que hago habitualmente es convertirlo en un miembro de "lectura estática pública" de la clase de Juego derivada. Véase también la respuesta de Jon Skeet: http://stackoverflow.com/questions/3217651/how-do-i-use-random-numbers-in-c/3218084#3218084 –

1
Random rnd = new Random(); 
rnd.Next(minValue, maxValue); 

es decir

rnd.Next(1,10); 
1

Uso método del objeto Random Next que toma un mínimo y máximo y devuelve un valor en ese rango:

var random = new Random();  
int randomNum = random.Next(min, max); 
1

Si bien puede usar la clase Random como todas las otros sugieren, la clase Random solo usa la generación de números aleatorios psuedo. El RandomNumberGenerator, que se puede encontrar en el espacio de nombres System.Security.Cryptography, crea números aleatorios reales.

Cómo utilizar:

RandomNumberGenerator rng = RandomNumberGenerator.Create(); 
byte[] rand = new byte[25]; //Set the length of this array to 
          // the number of random numbers you want 
rng.GetBytes(rand); 

Más información: http://msdn.microsoft.com/en-us/library/system.security.cryptography.randomnumbergenerator(v=VS.80).aspx

+0

RandomNumberGenerator es una clase abstracta. :) Use el RNGCryptoServiceProvider que se deriva de esta clase.Sin embargo, todavía produce números aleatorios "criptográficamente fuertes", que todavía es pseudoaleatorio. Y de acuerdo con http://stackoverflow.com/questions/418817/pros-and-cons-of-rngcryptoserviceprovider, RNGCryptoServiceProvider es más lento y excesivo para este asunto. –

+0

Esto será más aleatorio pero puede tener un impacto en el rendimiento, por lo tanto, equilibre en consecuencia. Puede que no necesites esta cantidad de aleatoriedad y que también podría no ser tan fácil de usar como Random – TJB

+0

. Pensé que lo haría como una opción. Para ser sincero, probablemente solo use Random también. –

7

A menos que necesite números criptográficamente seguros, Random debería estar bien para usted ... pero hay dos aspectos críticos a tener en cuenta:

  • No debe crear una nueva instancia cada vez que la necesite. Si crea una instancia sin especificar una semilla, usará la hora actual como semilla, lo que significa que si crea varias instancias en sucesión rápida, muchas de ellas producirán la misma secuencia de números. Normalmente crea una instancia duradera de Random y la vuelve a usar.
  • No es seguro para subprocesos. Si necesita generar números aleatorios a partir de varios hilos, debe pensar en tener una instancia por hilo. Lea this blog post para obtener más información, pero asegúrese de leer los comentarios también, ya que tienen información muy útil.
+0

+1. Excelentes consejos; He visto a personas ser mordidas por esas veces una y otra vez. Mi favorito es el error w/Random cuando las personas crean una instancia dentro de un circuito cerrado y lo siembran w/'DateTime.Now' esperando que eso solucione el problema. :) –

0

Aquí es mi generador aleatorio

private static Random rnd = new Random(Environment.TickCount); 

private int RandomNum(int Lower, int Upper) 
{ 

return rnd.Next(Lower, Upper);//MyRandomNumber; 

}