lunes, 25 de octubre de 2010

Las funciones drand48() y srand48()

¿Y si queremos un número aleatorio con decimales?. Tenemos la función drand48() que nos devuelve un número aleatorio con decimales entre 0.0 (incluido, puede salir el 0,0) y 1.0 (excluido, nunca saldrá 1.0). A partir de ahí es fácil transformarlo al rango que queramos. Si queremos un rango entre 10.0 y 20.0 (o entre M y N siendo N mayor que M y ambos con decimales, aunque sean .0)

#include
...
numero = drand48() * (20.0-10.0) + 10.0;
numero = drand48() * (N-M) + N;

De la misma forma que antes, la secuencia de números aleatorios se repetirá cada vez que ejecutemos nuestro programa y de igual manera, tenemos manera de cambiar la "semilla" de esa secuencia. Hay que llamar a la función srand48() pasándole un entero que sea disntinto en cada ejecución del programa. Nuevamente, tenemos las dos opciones anteriores

srand48(time(NULL));
srand48(getpid());

La funcion rand ()

En C, para obtener números aleatorios, tenemos la función rand(). Esta función, cada vez que la llamamos, nos devuelve un número entero aleatorio entre 0 y el RAND_MAX (un número enorme, como de 2 mil millones).

El primer problema que se nos presenta es que no solemos querer un número aleatorio en ese rango, sería un dado muy curioso el que tenga tantas caras. Podemos querer, por ejemplo, un número aleatorio entre 0 y 10. O de forma más general, entre 0 y N. La cuenta que debemos echar para eso es esta

#include
...
numero = rand() % 11;
numero = rand() % (N+1);

La operación módulo (%) nos da el resto de dividir rand() entre 11. Este resto puede ir de 0 a 10. De la misma forma, el módulo de rand() entre N+1 va de 0 a N.

¿Y si queremos un rango que no empiece en 0?. Por ejemplo, queremos un rango entre 20 y 30 (de forma más general, entre M y N con N mayor que M). Pues es fácil, obtenemos un número entre 0 y 10 y le sumamos 20 (un número entre 0 y N-M y le sumamos M)

numero = rand () % 11 + 20; // Este está entreo 20 y 30
numero = rand () % (N-M+1) + M; // Este está entre M y N

Obtencion de numeros aleatorios en C++

A veces queremos que nuestro programa obtenga números de forma aleatoria, por ejemplo, para simular una tirada de dados o el reparto de cartas en un juego. En C de linux tenemos varias funciones que nos permiten obtener estos valores aleatorios.

En esta explicación vamos a ver un uso básico de estas funciones. Algunas de las cosas que contamos aquí no son útiles para aplicaciones más serias, en las que se requiere que la secuencia de números aleatorios sea muy aleatoria, impredecible, que no se repita hasta pasado muchos números, etc, etc. Sin embargo, las explicaciones aquí presentadas servirán para la mayoría de nuestros programas.

GENERAR NUMEROS ALEATORIOS EN C++

En el lenguaje de programación C, tenemos la función rand() que genera una secuencia de número pseudoaleatorios. Pero, ¿cómo se pueden conseguir número totalmente aleatorios? ¿Qué os parece si nos ayudamos de la hora del sistema?



01 #include stdio.h
02 #include stdlib.h
03
04 int main (int argc, char *argv[])
05 {
06 int counter,stime;
07 long ltime;
08
09 /*obtener la hora local del sistema*/
10 ltime = time(NULL);
11 stime = (unsigned) ltime/2;
12 srand(stime);
13
14 for (counter=0;counter menor que 10;counter++)
15 printf("%d ", rand());
16
17 return 0;
18 }

viernes, 15 de octubre de 2010

programa con vectores

hacer un programa con vectores de 0 a 9 con los numeros de 2 en dos hasta 20.


programa de vectores

hallar un programa con vectores donde el indice empiese en cero y termine en 9. es decir 10 elementos con los numeros del 1 al 10.





.


















INICIALIZACION DE UN VECTOR

Podemos inicializar los vectores con valores
constantes:


#define N 100
//Declaración del vector y del subíndice
int vector[N], i;
for (i = 0; i < N; i++)
vector[i] = 0; // Inicialización de cada
// elemento del vector en 0


Podemos inicializar los vectores con otro tipo de
instrucciones:


int a[4] = {0};
a[0] = a[1] = a[2] = a[3] = 0
float n[5] = {0.25, 0.50, 0.75, 1.00, 1.25};
n[0] = 0.25 n[1] = 0.50 n[2] = 0.75
n[3] = 1.00 n[4] = 1.25

Podemos inicializar los vectores con otro tipo de
instrucciones :

char cdn[8] = {'S', 'I', ' ', 'a', 'l', 'l', 'i', ','};
cdn[0] = 'S' cdn[1] = 'I' cdn[2] = ' '
cdn[3] = 'a' cdn[4] = 'l' cdn[5] = 'l'
cdn[6] = 'i' cdn[7] = ','