/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Sobre rand() en C y C++

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Pantalàimon_



Registrado: 17 Jul 2007
Mensajes: 638

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 16/12/2010 9:54 am
Título:

Siempre es interesante el siguiente enlace:

rand() junto con srand() funcionan muy bien!!!


http://www.chuidiang.com/clinux/funciones/rand.php
_________________
No estamos locos sabemos lo que aprendemos!!!
Volver arriba
Pantalàimon_



Registrado: 17 Jul 2007
Mensajes: 638

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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ú

MensajePublicado: 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
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com