Ver Mensaje Individual
  #1 (permalink)  
Antiguo 19/09/2010, 12:30
jbgae
 
Fecha de Ingreso: septiembre-2010
Mensajes: 6
Antigüedad: 13 años, 7 meses
Puntos: 0
Fallo en programa que muestra la frecuencia aparece caras de un dado

Hola, tengo un problema con un ejercicio que estoy realizando en C++. Les cuento, tengo que escribir un programa que simule 10 000 000 de tiradas de un dado e imprima las frecuencias que se obtienen para cada una de las caras.

Mi propuesta para resolver este ejercicio es:
Código c++:
Ver original
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4. using namespace std;
  5.  
  6. //Función que genera un número pseudoaleatorio entero en el intervalo discreto [a, b].Conseguir un entero entre [a,b] es igual a conseguirlo
  7. //entre a + [0, b-a]. Para conseguir enteros entre 0 y b-a recurrimos al resto de la división entera, ya que el resto de dividir cualquier
  8. //número entre b-a+1 nos da valores entre 0 y b-a, a los cuales les sumaremos el valor a obteniendo así enteros del intervalo [a, b].
  9. int Numero_Pseudoaleatorio(int a, int b){
  10.   return a+(rand()%(b-a+1));
  11. }
  12.  
  13. int main()
  14. {
  15.   const int a=1, num_caras = 6;
  16.   const float num_tiradas = 10000000;
  17.   int v[num_caras], num_pseudo = 0;
  18.  
  19.   for(int i=1; i<=num_caras; i++)     // Inicializamos el vector a 0
  20.     v[i]=0;
  21.  
  22.   srand(time(0));   // Usaremos como semilla un valor variable para poder observar distintos resultados en cada ejecución.
  23.  
  24.   for(int i=1; i<=num_tiradas; i++){    //realizamos las 10000000 tiradas del dado
  25.     num_pseudo = Numero_Pseudoaleatorio(a,num_caras);   //almacenamos el resultado de la tirada (valor de la cara del dado)
  26.     v[num_pseudo]++;    //incrementamos las veces que aparece cada valor.
  27.    
  28.   }
  29.   cout << "****muestra el número de veces que aparece cada cara****" << endl;
  30.   cout << "cara   1  -----> " << v[1] << endl;
  31.   cout << "cara   2  -----> " << v[2] << endl;
  32.   cout << "cara   3  -----> " << v[3] << endl;
  33.   cout << "cara   4  -----> " << v[4] << endl;
  34.   cout << "cara   5  -----> " << v[5] << endl;
  35.   cout << "cara   6  -----> " << v[6] << endl;
  36.  
  37.  
  38.   float suma = 0;
  39.  
  40.   for(int i=1; i <=num_caras; i++){  /* EN ESTE BUCLE ESTA EL PROBLEMA, ¿PORQUE V[6] CAMBIA SU VALOR? */
  41.     cout<< "cara 6 -->" << v[6] << endl;  /*HAGO ESTO PARA COMPROBAR QUE V[6] CAMBIA SU VALOR AL ENTRAR EN EL BUCLE Y SE VA INCREMENTANDO*/
  42.    
  43.     cout << "La frecuencia relativa de " << i << " es: " << v[i]/num_tiradas << endl;
  44.    
  45.     suma = suma + v[i]/num_tiradas;
  46.     cout << " frecuencia absoluta = " << suma << endl;
  47.    
  48.   }
  49.  
  50. }

pero cuando obtengo los resultados, veo que en el último bucle for cambia el valor de v[6] en cada iteración y realmente no entiendo porqué sucede esto.

Al final la frecuencia absoluta no me sale 1, por lo que se que el problema esta mal.

Espero que puedan ayudarme.
Muchas gracias y un saludo.