Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: luchomax en 1 Febrero 2012, 23:35 PM

Título: Problemas con rand
Publicado por: luchomax en 1 Febrero 2012, 23:35 PM
Hola gente, he estado escribiendo este programa sencillo de tirada de dos dados como ejercicio en el aprendizaje de C y resulta que los valores que obtengo (para dos tiradas individuales) dan valores preferenciales a cierto resultado (los de 6 para el primer dado) y desconozco porque... Les paso el programa y los valores que saco por pantalla en la tirada de dados. Gracias de antemano. Lucho

-------------------------------------------------------------------------------------------------
Programa
-------------------------------------------------------------------------------------------------
/* El programa tira los dados de forma independiente 5000000 veces se mostrara el resultado en forma de tabla*/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int sorteo1(void);
int sorteo2(void);

main()
{
  int i, j, k=1, l, o, sum;
  int a[13]={0};
  int freq[6][6]={0};
  float Probabilidad[13];
  srand(time(NULL));

 
  while(k<=5000000){
    
     i = sorteo1();
    
     j = sorteo2();
   
    /* printf("%d, %d\n", i, j); */
    
     sum=i+j;
    
     if(i==1){
       switch(j){
      case 1 : freq[1][1]= freq[1][1] + 1;
         break;
      case 2 : freq[1][2] = freq[1][2] + 1;
         break;
      case 3 : freq[1][3] = freq[1][3] + 1;
         break;
      case 4 : freq[1][4] = freq[1][4] + 1;
         break;
      case 5 : freq[1][5] = freq[1][5] + 1;
         break;
      case 6 : freq[1][6] = freq[1][6] + 1;
          break;
      default : ;
          break;
          }
   }else if(i==2){
       switch(j){
      case 1 : freq[2][1] = freq[2][1] + 1;
         break;
      case 2 : freq[2][2] = freq[2][2] + 1;
         break;
      case 3 : freq[2][3] = freq[2][3] + 1;
         break;
      case 4 : freq[2][4] = freq[2][4] + 1;
         break;
      case 5 : freq[2][5] = freq[2][5] + 1;
         break;
      case 6 : freq[2][6] = freq[2][6] + 1;
          break;
      default : ;
          break;
      }
   }else if(i==3){
       switch(j){
      case 1 : freq[3][1] = freq[3][1] + 1;
         break;
      case 2 : freq[3][2] = freq[3][2] + 1;
         break;
      case 3 : freq[3][3] = freq[3][3] + 1;
         break;
      case 4 : freq[3][4] = freq[3][4] + 1;
         break;
      case 5 : freq[3][5] = freq[3][5] + 1;
         break;
      case 6 : freq[3][6] = freq[3][6] + 1;
          break;
      default : ;
          break;
      }
   }else if(i==4){
       switch(j){
      case 1 : freq[4][1] = freq[4][1] + 1;
         break;
      case 2 : freq[4][2] = freq[4][2] + 1;
         break;
      case 3 : freq[4][3] = freq[4][3] + 1;
         break;
      case 4 : freq[4][4] = freq[4][4] + 1;
         break;
      case 5 : freq[4][5] = freq[4][5] + 1;
         break;
      case 6 : freq[4][6] = freq[4][6] + 1;
          break;
      default : ;
          break;
      }
   }else if(i==5){
       switch(j){
      case 1 : freq[5][1] = freq[5][1] + 1;
         break;
      case 2 : freq[5][2] = freq[5][2] + 1;
         break;
      case 3 : freq[5][3] = freq[5][3] + 1;
         break;
      case 4 : freq[5][4] = freq[5][4] + 1;
         break;
      case 5 : freq[5][5] = freq[5][5] + 1;
         break;
      case 6 : freq[5][6] = freq[5][6] + 1;
          break;
      default : ;
          break;
      }
   }else if(i==6){
       switch(j){
      case 1 : freq[6][1] = freq[6][1] + 1;
         break;
      case 2 : freq[6][2] = freq[6][2] + 1;
         break;
      case 3 : freq[6][3] = freq[6][3] + 1;
         break;
      case 4 : freq[6][4] = freq[6][4] + 1;
         break;
      case 5 : freq[6][5] = freq[6][5] + 1;
         break;
      case 6 : freq[6][6] = freq[6][6] + 1;
          break;
      default : ;
          break;
      }
   }else{};
   
   switch(sum){
      case 2 : a[2]++;
         break;
      case 3 : a[3]++;
         break;
      case 4 : a[4]++;
         break;
      case 5 : a[5]++;
         break;
      case 6 : a[6]++;
         break;
      case 7 : a[7]++;
         break;
      case 8 : a[8]++;
         break;
      case 9 : a[9]++;
         break;
      case 10 : a[10]++;
         break;
      case 11 : a[11]++;
         break;
      case 12 : a[12]++;
         break;
      default : ;
         break;
   }
   
   k = k + 1;
}
   
  printf("Los resultados son\n");
  printf("\t [j=1]\t [j=2]\t [j=3]\t [j=4]\t [j=5]\t [j=6]\n");
 

  for(l=1; l<=6; l++){
    printf("[i=%d]\t %d\t %d\t %d\t %d\t %d\t %d\n", l, freq[l][1], freq[l][2], freq[l][3], freq[l][4], freq[l][5], freq[l][6]);
  };
 
 
  for (o=2; o<=12; o++){

     Probabilidad
Título: Re: Problemas con rand
Publicado por: Kasswed en 2 Febrero 2012, 00:18 AM
Los números que genera rand() son pseudoaleatorios, es por eso que unos salen más que otros.

No es culpa de tu código, es culpa de la computación en sí.
Título: Re: Problemas con rand
Publicado por: rir3760 en 2 Febrero 2012, 00:45 AM
Si revisas el programa con cuidado te darás cuenta que se puede acortar de forma sustancial.

Hay que revisar las sentencias de selección "switch". La primera es:
switch(j){
case 1:
   freq[1][1]= freq[1][1] + 1;
   break;
case 2:
   freq[1][2] = freq[1][2] + 1;
   break;
case 3:
   freq[1][3] = freq[1][3] + 1;
   break;
case 4:
   freq[1][4] = freq[1][4] + 1;
   break;
case 5:
   freq[1][5] = freq[1][5] + 1;
   break;
case 6:
   freq[1][6] = freq[1][6] + 1;
   break;
default:
   ;
   break;
}

Todo ese bloque lo puedes sustituir por una sola sentencia:
freq[1][j]++;

La composición de la sentencia de selección "if" utilizando el valor de la variable "i" como condición es similar:
if (i == 1)
   freq[1][j]++;
else if (i == 2)
   freq[2][j]++;
else ...

De nuevo todo ese bloque "if" + "switch" se puede reducir a solo:
freq[i][j]++;

Un saludo