| Ver tema anterior :: Ver siguiente tema |
| Autor | Mensaje |
|---|
Pantalàimon_
Registrado: 17 Jul 2007 Mensajes: 638
| Publicado: 04/12/2010 7:19 pm | | | Título: Sobre rand() en C y C++ |
| Buenas, me preguntaba si el estándar especifica algún algoritmo para la implementación de rand() en C y en C++. En caso de que sí, de qué tipo se trata y qué tan bueno es el algoritmo para generar números aleatorios.
Un saludo! |
|
| Volver arriba | |
 |
rir3760

Registrado: 01 Oct 2004 Mensajes: 5853 Ubicación: Mexico
| Publicado: 07/12/2010 6:16 am | | | Título: |
| En C no hay restricciones en relacion a su biblioteca estandar, la unica limitante de la funcion "rand" es que debe retornar un valor en el rango 0 a RAND_MAX.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
|
| Volver arriba | |
 |
Pantalàimon_
Registrado: 17 Jul 2007 Mensajes: 638
| Publicado: 07/12/2010 6:34 am | | | Título: |
| Gracias.
Entonces debo entender que si para un programa es crítico utilizar una función generadora medianamente buena la debería implementar o buscarla de una librería no estándar por que no puedo asegurar lo buena que pueda ser rand(). |
|
| Volver arriba | |
 |
|
rir3760

Registrado: 01 Oct 2004 Mensajes: 5853 Ubicación: Mexico
| Publicado: 07/12/2010 6:41 am | | | Título: |
| Me temo que es correcto. Si estas desarrollando un programa con requisitos especificos esa funcion no te garantiza el resultado (en realidad nada).
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
|
| Volver arriba | |
 |
ziprinet
Registrado: 16 Dic 2010 Mensajes: 1
| |
| Volver arriba | |
 |
Pantalàimon_
Registrado: 17 Jul 2007 Mensajes: 638
| Publicado: 16/12/2010 12:56 pm | | | Título: |
| Hola ziprinet, he echado un vistazo al enlace y lo único que explica es como hacer funcionar rand() y srand() pero no sale nada relacionado con la duda que tenía.
Un saludo! |
|
| Volver arriba | |
 |
|
MoOnWaLkEr
Registrado: 12 Dic 2010 Mensajes: 9
| Publicado: 18/12/2010 6:15 pm | | | Título: |
| mira si con lo que te refieres es a que exista una sola manera y que siempre se implemente no existe solo esta la funcion y como decia un amigo arriba tienes que hacerla variar entre intervalos.
por ej:
//utilizando siempre las librerias stdlib.h y time.h
for(i=0;i<tamaño;i++) v[i]=srand(NULL)%99;
eso llena el vector con valores entre 0 y 99
saludos _________________ La imaginacion es mas importante que el conocimiento.......Albert Einstein. |
|
| Volver arriba | |
 |
Pantalàimon_
Registrado: 17 Jul 2007 Mensajes: 638
| Publicado: 18/12/2010 8:39 pm | | | Título: |
| El código para generar números pseudoaleatorios entre 0 y 99 utilizando como semilla la fecha del ordenador y almacenarlos en un vector sería:
| Código: | int v[100];
/* ... */
srand( time( NULL ) ); for( i = 0; i < 100; i++ ) v[i] = rand() % 100; |
PD.: Aprecio los aportes y las ganas de ayudar pero es que no tienen nada que ver con mi duda, la cual ri3760 ya me resolvió con sus posts.
Un saludo! |
|
| Volver arriba | |
 |
rir3760

Registrado: 01 Oct 2004 Mensajes: 5853 Ubicación: Mexico
| Publicado: 24/12/2010 7:38 am | | | Título: |
| Hola Pantalàimon_
Antes de entrar en detalle un precedente: en C++ el metodo "sort", parte de la biblioteca estandar de C++, requiere una eficiencia de "N Log N", la cual puede darse mediante algoritmos como QuickSort, MergeSort y LibrarySort (todavia no encuentro una implementacion decente de esta y mis matematicas estan poniendo demasiados obstaculos).
Bueno, tal vez tu duda esta enfocada en algo similar, al no existir restricciones en el algoritmo tal vez tengas dudas en la (si recuerdo el termino correcto) "distribucion".
A ese respecto y, disculpa si esto no viene al caso, la FAQ de comp.lang indica (por desgracia en ingles):
| Cita: | -------------------------------------------------------------------- 13.15: I need a random number generator.
A: The Standard C library has one: rand(). The implementation on your system may not be perfect, but writing a better one isn't necessarily easy, either.
If you do find yourself needing to implement your own random number generator, there is plenty of literature out there; see the References. There are also any number of packages on the net: look for r250, RANLIB, and FSULTRA (see question 18.16).
References: K&R2 Sec. 2.7 p. 46, Sec. 7.8.7 p. 168; ISO Sec. 7.10.2.1; H&S Sec. 17.7 p. 393; PCS Sec. 11 p. 172; Knuth Vol. 2 Chap. 3 pp. 1-177; Park and Miller, "Random Number Generators: Good Ones are Hard to Find".
-------------------------------------------------------------------- 13.16: How can I get random integers in a certain range?
A: The obvious way,
rand() % N /* POOR */
(which tries to return numbers from 0 to N-1) is poor, because the low-order bits of many random number generators are distressingly *non*-random. (See question 13.18.) A better method is something like
(int)((double)rand() / ((double)RAND_MAX + 1) * N)
If you're worried about using floating point, you could use
rand() / (RAND_MAX / N + 1)
Both methods obviously require knowing RAND_MAX (which ANSI #defines in <stdlib.h>), and assume that N is much less than RAND_MAX.
(Note, by the way, that RAND_MAX is a *constant* telling you what the fixed range of the C library rand() function is. You cannot set RAND_MAX to some other value, and there is no way of requesting that rand() return numbers in some other range.)
If you're starting with a random number generator which returns floating-point values between 0 and 1, all you have to do to get integers from 0 to N-1 is multiply the output of that generator by N.
References: K&R2 Sec. 7.8.7 p. 168; PCS Sec. 11 p. 172. |
Espero sea de utilidad.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
|
| Volver arriba | |
 |
|
Pantalàimon_
Registrado: 17 Jul 2007 Mensajes: 638
| Publicado: 24/12/2010 9:29 am | | | Título: |
| Gracias.
Dicha duda me surgió cuando estaba ayudando a implementar un generador de números aleatorios en otro foro siguiendo el algoritmo r250. Al leer sobre varios algoritmos para generar números aleatorios me vino la duda de lo bueno que era rand() en términos no solo de distribución sino de qué largo era el periodo de números pseudoaleatorios hasta volverse a repetir.
Un saludo y buenas fiestas. |
|
| Volver arriba | |
 |
eduar2083
Registrado: 10 Ago 2008 Mensajes: 43 Ubicación: Lima - Perú
| Publicado: 28/12/2010 8:28 am | | | Título: |
| Buenas tardes, hace algún tiempo encontré una implementación de la función rand en el clásico libro "El Lenguaje de programación C" de Kernigham y Ritchie. Espero sea de ayuda. Saludos.| Código: | #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <time.h>
/* Prototipos */ int rand( void ); void srand( unsigned int semilla );
unsigned long next = 1;
int main( void ) { int numero; char continuar = 's';
srand( time(NULL) );
/* Ciclo de control del programa */ while ( continuar != 'n' ) { system( "cls" ); numero = rand(); printf( "Numero generado: %d\n", numero );
printf( "\n\n\n\t\tDesea continuar (s/n): " ); fflush( stdin ); continuar = (char)toupper( getchar() ); }
return 0; /* indicar terminación exitosa */
} /* Fin de main */
/* Implementación de funciones */
/* Regresa un entero pseudoaleatorio entre 0 y 32767 */ int rand( void ) { next = next * 1103515245 + 12345;
return (unsigned int)(next / 65536) % 32768; }
/* Fija la semilla para rand() */ void srand( unsigned int semilla ) { next = semilla; } |
|
|
| Volver arriba | |
 |
|
|