Numeros Random

28/09/2007 - 17:00 por Robert Barreiro | Informe spam
Buenas, que tal?

Estoy haciendo una aplicacion que debe generar números al azar (que luego
van a representar barajas) y las mismas se generan todas dentro de un bucle
while. Estoy utilizando

Random randGen = new Random(Convert.ToInt32(DateTime.Now.Ticks &
0x000000007FFFFFFF));

con la intención de que los numeros generados sean lo suficientemente
aleatorios pero la verdad la generación es tan rápida que muchas veces me
genera los mismos valores o varios de ellos son iguales y luego cambian,
etc. Incluso le agergué un System.Threading.Thread.Sleep(50); con la
intención de que espere un poco antes de generar el nuevo valor, pero el
cmoportamiento sigue sin ser bueno y no quiero aumentar el valor del Sleep a
100 o mas.

Alguno conoce alguna manera de generar verdaderos numeros al azar y que no
tenga problemas al generar una serie de números muy rápido?


Agradezco mucho su respuesta.


Saludos,



Robert.

Preguntas similare

Leer las respuestas

#6 Harvey Triana
01/10/2007 - 18:29 | Informe spam
No era mi intensión dejar líneas de por medio en el código -- Cosas del
Outlook.

"Harvey Triana" escribió en el mensaje
news:%
Elegante. Me gusto la naturaleza de la redacción *. Supongo que por ser
solo un ejemplo la función cadenaAleatoria tiene un conjunto de caracteres
tan reducido. La función que publico a continuación me gusta por la
versatilidad del conjunto de caracteres, y el tratamiento por el indice
del array (cosa que poco se ve en VB). La iniciación de la semilla es como
nos explicaste:



public static string RandomizeString(int Size)

{

const string SCANSTRING =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

StringBuilder sb = new StringBuilder();



for (int i = 0; i < Size; i++)

{

sb.Append(SCANSTRING[rnd.Next(0, SCANSTRING.Length - 1)]);

}

return sb.ToString();

}



<Harvey Triana />



"Guillermo 'guille'" escribió en el mensaje
news:
Acabo de publicar un artículo sobre este tema, ya que ese tipo de "fallo"
es muy común:
http://www.elguille.info/NET/dotnet..._Next.aspx


Nos vemos
Guillermo

Microsoft MVP Visual Basic desde 1997
Tus consultas en los foros del Guille: http://foros.elguille.info/


"Robert Barreiro" wrote in message
news:u%
Ahhh, te entendí, te entendí. Bien ahi!!! :)

Grande Guille. Muchas gracias por la info.



Saludos!!




"Guillermo 'guille'" escribió en el mensaje
news:
El valor ese que le indicas en el constructor es solo para la semilla
del generador.
Por tanto, no deberías estar creando objetos nuevos dentro del bucle.
Crea un objeto Random al principio, usando ese código si quieres, para
que la semilla sea distinta, pero después simplemente usa los métodos
de la clase para generar el número.

Recuerda que esa semilla es la que indica que la serie no será la misma
siempre... es decir, si siempre usaras una misma semilla, siempre
debería generar los mismos números.

Nos vemos
Guillermo

Microsoft MVP Visual Basic desde 1997
Tus consultas en los foros del Guille: http://foros.elguille.info/


"Robert Barreiro" wrote in message
news:
Buenas, que tal?

Estoy haciendo una aplicacion que debe generar números al azar (que
luego van a representar barajas) y las mismas se generan todas dentro
de un bucle while. Estoy utilizando

Random randGen = new Random(Convert.ToInt32(DateTime.Now.Ticks &
0x000000007FFFFFFF));

con la intención de que los numeros generados sean lo suficientemente
aleatorios pero la verdad la generación es tan rápida que muchas veces
me genera los mismos valores o varios de ellos son iguales y luego
cambian, etc. Incluso le agergué un System.Threading.Thread.Sleep(50);
con la intención de que espere un poco antes de generar el nuevo
valor, pero el cmoportamiento sigue sin ser bueno y no quiero aumentar
el valor del Sleep a 100 o mas.

Alguno conoce alguna manera de generar verdaderos numeros al azar y
que no tenga problemas al generar una serie de números muy rápido?


Agradezco mucho su respuesta.


Saludos,



Robert.















Respuesta Responder a este mensaje
#7 Guillermo guille
08/10/2007 - 19:58 | Informe spam
es para que se vea claro, je, je

Nos vemos
Guillermo

Microsoft MVP Visual Basic desde 1997
Tus consultas en los foros del Guille: http://foros.elguille.info/


"Harvey Triana" wrote in message
news:%23Ixz%
No era mi intensión dejar líneas de por medio en el código -- Cosas del
Outlook.

"Harvey Triana" escribió en el mensaje
news:%
Elegante. Me gusto la naturaleza de la redacción *. Supongo que por ser
solo un ejemplo la función cadenaAleatoria tiene un conjunto de
caracteres tan reducido. La función que publico a continuación me gusta
por la versatilidad del conjunto de caracteres, y el tratamiento por el
indice del array (cosa que poco se ve en VB). La iniciación de la semilla
es como nos explicaste:



public static string RandomizeString(int Size)

{

const string SCANSTRING =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

StringBuilder sb = new StringBuilder();



for (int i = 0; i < Size; i++)

{

sb.Append(SCANSTRING[rnd.Next(0, SCANSTRING.Length - 1)]);

}

return sb.ToString();

}



<Harvey Triana />



"Guillermo 'guille'" escribió en el mensaje
news:
Acabo de publicar un artículo sobre este tema, ya que ese tipo de
"fallo" es muy común:
http://www.elguille.info/NET/dotnet..._Next.aspx


Nos vemos
Guillermo

Microsoft MVP Visual Basic desde 1997
Tus consultas en los foros del Guille: http://foros.elguille.info/


"Robert Barreiro" wrote in message
news:u%
Ahhh, te entendí, te entendí. Bien ahi!!! :)

Grande Guille. Muchas gracias por la info.



Saludos!!




"Guillermo 'guille'" escribió en el mensaje
news:
El valor ese que le indicas en el constructor es solo para la semilla
del generador.
Por tanto, no deberías estar creando objetos nuevos dentro del bucle.
Crea un objeto Random al principio, usando ese código si quieres, para
que la semilla sea distinta, pero después simplemente usa los métodos
de la clase para generar el número.

Recuerda que esa semilla es la que indica que la serie no será la
misma siempre... es decir, si siempre usaras una misma semilla,
siempre debería generar los mismos números.

Nos vemos
Guillermo

Microsoft MVP Visual Basic desde 1997
Tus consultas en los foros del Guille: http://foros.elguille.info/


"Robert Barreiro" wrote in message
news:
Buenas, que tal?

Estoy haciendo una aplicacion que debe generar números al azar (que
luego van a representar barajas) y las mismas se generan todas dentro
de un bucle while. Estoy utilizando

Random randGen = new Random(Convert.ToInt32(DateTime.Now.Ticks &
0x000000007FFFFFFF));

con la intención de que los numeros generados sean lo suficientemente
aleatorios pero la verdad la generación es tan rápida que muchas
veces me genera los mismos valores o varios de ellos son iguales y
luego cambian, etc. Incluso le agergué un
System.Threading.Thread.Sleep(50); con la intención de que espere un
poco antes de generar el nuevo valor, pero el cmoportamiento sigue
sin ser bueno y no quiero aumentar el valor del Sleep a 100 o mas.

Alguno conoce alguna manera de generar verdaderos numeros al azar y
que no tenga problemas al generar una serie de números muy rápido?


Agradezco mucho su respuesta.


Saludos,



Robert.



















Respuesta Responder a este mensaje
#8 Guillermo guille
08/10/2007 - 20:12 | Informe spam
Un par de cosas para que funcione mejor ese código:
El cálculo del valor mayor, lo podrías sacar fuera del bucle, ya que siempre
permanece igual, seguramente el compilador de C# lo optimizará, pero...
La letra "z" NUNCA estará en la cadena... (supongo), ya que el valor máximo
que sacará será menor de (SCANSTRING.Length - 1), con lo cual, el valor
mayor que sacará ese método Next será desde 0 hasta 2 menos de la longitud
de la constante.
¿recuerdas lo de Next(97, 122) ? ;-)))

Es que caemos todos en la trampa... a mi me pasa a menudo... ;-))))

Nos vemos
Guillermo

Microsoft MVP Visual Basic desde 1997
Tus consultas en los foros del Guille: http://foros.elguille.info/


"Harvey Triana" wrote in message
news:%
Elegante. Me gusto la naturaleza de la redacción *. Supongo que por ser
solo un ejemplo la función cadenaAleatoria tiene un conjunto de caracteres
tan reducido. La función que publico a continuación me gusta por la
versatilidad del conjunto de caracteres, y el tratamiento por el indice
del array (cosa que poco se ve en VB). La iniciación de la semilla es como
nos explicaste:



public static string RandomizeString(int Size)

{

const string SCANSTRING =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

StringBuilder sb = new StringBuilder();



for (int i = 0; i < Size; i++)

{

sb.Append(SCANSTRING[rnd.Next(0, SCANSTRING.Length - 1)]);

}

return sb.ToString();

}



<Harvey Triana />



"Guillermo 'guille'" escribió en el mensaje
news:
Acabo de publicar un artículo sobre este tema, ya que ese tipo de "fallo"
es muy común:
http://www.elguille.info/NET/dotnet..._Next.aspx


Nos vemos
Guillermo

Microsoft MVP Visual Basic desde 1997
Tus consultas en los foros del Guille: http://foros.elguille.info/


"Robert Barreiro" wrote in message
news:u%
Ahhh, te entendí, te entendí. Bien ahi!!! :)

Grande Guille. Muchas gracias por la info.



Saludos!!




"Guillermo 'guille'" escribió en el mensaje
news:
El valor ese que le indicas en el constructor es solo para la semilla
del generador.
Por tanto, no deberías estar creando objetos nuevos dentro del bucle.
Crea un objeto Random al principio, usando ese código si quieres, para
que la semilla sea distinta, pero después simplemente usa los métodos
de la clase para generar el número.

Recuerda que esa semilla es la que indica que la serie no será la misma
siempre... es decir, si siempre usaras una misma semilla, siempre
debería generar los mismos números.

Nos vemos
Guillermo

Microsoft MVP Visual Basic desde 1997
Tus consultas en los foros del Guille: http://foros.elguille.info/


"Robert Barreiro" wrote in message
news:
Buenas, que tal?

Estoy haciendo una aplicacion que debe generar números al azar (que
luego van a representar barajas) y las mismas se generan todas dentro
de un bucle while. Estoy utilizando

Random randGen = new Random(Convert.ToInt32(DateTime.Now.Ticks &
0x000000007FFFFFFF));

con la intención de que los numeros generados sean lo suficientemente
aleatorios pero la verdad la generación es tan rápida que muchas veces
me genera los mismos valores o varios de ellos son iguales y luego
cambian, etc. Incluso le agergué un System.Threading.Thread.Sleep(50);
con la intención de que espere un poco antes de generar el nuevo
valor, pero el cmoportamiento sigue sin ser bueno y no quiero aumentar
el valor del Sleep a 100 o mas.

Alguno conoce alguna manera de generar verdaderos numeros al azar y
que no tenga problemas al generar una serie de números muy rápido?


Agradezco mucho su respuesta.


Saludos,



Robert.















Respuesta Responder a este mensaje
#9 Harvey Triana
10/10/2007 - 22:00 | Informe spam
rnd.Next(0, SCANSTRING.Length)
Como no...
Gracias.
<Harvey Triana />

"Guillermo 'guille'" escribió en el mensaje
news:
Un par de cosas para que funcione mejor ese código:
El cálculo del valor mayor, lo podrías sacar fuera del bucle, ya que
siempre permanece igual, seguramente el compilador de C# lo optimizará,
pero...
La letra "z" NUNCA estará en la cadena... (supongo), ya que el valor
máximo que sacará será menor de (SCANSTRING.Length - 1), con lo cual, el
valor mayor que sacará ese método Next será desde 0 hasta 2 menos de la
longitud de la constante.
¿recuerdas lo de Next(97, 122) ? ;-)))

Es que caemos todos en la trampa... a mi me pasa a menudo... ;-))))

Nos vemos
Guillermo

Microsoft MVP Visual Basic desde 1997
Tus consultas en los foros del Guille: http://foros.elguille.info/


"Harvey Triana" wrote in message
news:%
Elegante. Me gusto la naturaleza de la redacción *. Supongo que por ser
solo un ejemplo la función cadenaAleatoria tiene un conjunto de
caracteres tan reducido. La función que publico a continuación me gusta
por la versatilidad del conjunto de caracteres, y el tratamiento por el
indice del array (cosa que poco se ve en VB). La iniciación de la semilla
es como nos explicaste:



public static string RandomizeString(int Size)

{

const string SCANSTRING =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

StringBuilder sb = new StringBuilder();



for (int i = 0; i < Size; i++)

{

sb.Append(SCANSTRING[rnd.Next(0, SCANSTRING.Length - 1)]);

}

return sb.ToString();

}



<Harvey Triana />



"Guillermo 'guille'" escribió en el mensaje
news:
Acabo de publicar un artículo sobre este tema, ya que ese tipo de
"fallo" es muy común:
http://www.elguille.info/NET/dotnet..._Next.aspx


Nos vemos
Guillermo

Microsoft MVP Visual Basic desde 1997
Tus consultas en los foros del Guille: http://foros.elguille.info/


"Robert Barreiro" wrote in message
news:u%
Ahhh, te entendí, te entendí. Bien ahi!!! :)

Grande Guille. Muchas gracias por la info.



Saludos!!




"Guillermo 'guille'" escribió en el mensaje
news:
El valor ese que le indicas en el constructor es solo para la semilla
del generador.
Por tanto, no deberías estar creando objetos nuevos dentro del bucle.
Crea un objeto Random al principio, usando ese código si quieres, para
que la semilla sea distinta, pero después simplemente usa los métodos
de la clase para generar el número.

Recuerda que esa semilla es la que indica que la serie no será la
misma siempre... es decir, si siempre usaras una misma semilla,
siempre debería generar los mismos números.

Nos vemos
Guillermo

Microsoft MVP Visual Basic desde 1997
Tus consultas en los foros del Guille: http://foros.elguille.info/


"Robert Barreiro" wrote in message
news:
Buenas, que tal?

Estoy haciendo una aplicacion que debe generar números al azar (que
luego van a representar barajas) y las mismas se generan todas dentro
de un bucle while. Estoy utilizando

Random randGen = new Random(Convert.ToInt32(DateTime.Now.Ticks &
0x000000007FFFFFFF));

con la intención de que los numeros generados sean lo suficientemente
aleatorios pero la verdad la generación es tan rápida que muchas
veces me genera los mismos valores o varios de ellos son iguales y
luego cambian, etc. Incluso le agergué un
System.Threading.Thread.Sleep(50); con la intención de que espere un
poco antes de generar el nuevo valor, pero el cmoportamiento sigue
sin ser bueno y no quiero aumentar el valor del Sleep a 100 o mas.

Alguno conoce alguna manera de generar verdaderos numeros al azar y
que no tenga problemas al generar una serie de números muy rápido?


Agradezco mucho su respuesta.


Saludos,



Robert.


















email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida