2011-10-02 21 views
5

El proceso C#/XNA para crear números aleatorios es bastante rápido y fácil, sin embargo, es posiblemente el peor generador de números aleatorios de distribución que haya visto. ¿Hay algún método mejor que sea fácil de implementar para C#/XNA?C#/XNA pseudo-creación de números aleatorios

rand.Next() simplemente no se ajusta a mis necesidades.

de:

estática rand aleatoria privada = new Random();

Coloco objetos al azar, en todo mi programa. a veces 10, a veces 200.

Al llamar a objetos aleatorios (los valores x val y y val son ambos aleatorios en un plano 2d), se agrupan. El código de generación está limpio y los llama buenos, iterado limpiamente y saca un nuevo número aleatorio con cada valor. Pero se agrupan, notablemente mal, lo cual no es muy bueno con números aleatorios después de todo. Tengo una habilidad intermedia con C#, pasé por encima de as3, lo que pareció manejar mejor la aleatoriedad.

Soy consciente de que son pseudoaleatorios, pero C# en un sistema de Windows, la agrupación es grotesca.

+0

¿a qué proceso de generación de números aleatorios se refiere? 'System.Random'? –

+0

¿Cuáles son sus necesidades? – PostMan

+0

He actualizado, con un poco más de información. Y gemidos obligatorios + lloriqueos. – SimpleRookie

Respuesta

2

¿Se puede usar System.Security.Cryptography.RandomNumberGenerator de XNA?

var rand = RandomNumberGenerator.Create(); 
byte[] bytes = new byte[4]; 

rand.GetBytes(bytes); 

int next = BitConverter.ToInt32(bytes, 0); 

para obtener un valor dentro de un rango min/max:

static RandomNumberGenerator _rand = RandomNumberGenerator.Create(); 

static int RandomNext(int min, int max) 
{ 
    if (min > max) throw new ArgumentOutOfRangeException("min"); 

    byte[] bytes = new byte[4]; 

    _rand.GetBytes(bytes); 

    uint next = BitConverter.ToUInt32(bytes, 0); 

    int range = max - min; 

    return (int)((next % range) + min); 
} 
+0

¿Cómo se establecería el mínimo y máximo para ese método? – SimpleRookie

+1

¿Podría darnos un ejemplo de cuáles son sus valores mínimos/máximos? –

+0

0-10, 1-200, -100-100, material estándar. – SimpleRookie

1

También puede depender de cómo se está utilizando System.Random. Como regla general, no es una buena idea crear nuevas instancias de Random una y otra vez, ya que los objetos Random creados aproximadamente al mismo tiempo muy probablemente serán sembrados con el mismo número aleatorio (de manera predeterminada, el tiempo se usa como semilla .) En cambio, cree una instancia única de Aleatorio y use solo esa instancia en todo su programa.

A menos que el objetivo sea la seguridad, que probablemente no sea el caso aquí, será mejor que solo use System.Random.