Foro de elhacker.net

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
  • = (float)a
  • /(float)5000000;
    
     printf("el valor\t%d \tse obtuvo \t%d veces\t Probabilidad : %4.2f\n", o, a
  • , Probabilidad
  • );
  };
 
  return 0;
}


int sorteo1(void)
{
  int m;
 
  m= (1+(rand()%6));

   /*printf("%d\n",i);*/
   
  return m;
}

int sorteo2(void)
{
  int n;
 
  n = ((rand()%6)+1);

   /*printf("%d\n",j);*/
   
  return n;
}
------------------------------------------------------------------------------------------------

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Resultados
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Los resultados son
    [j=1]    [j=2]    [j=3]    [j=4]    [j=5]    [j=6]
[i=1]    139028    138463    138908    138484    138397    139588
[i=2]    138629    138542    138601    138962    138716    138274
[i=3]    139068    139052    138902    138533    138982    139117
[i=4]    138994    138669    138774    139443    139414    139231
[i=5]    138966    138549    139167    139264    138653    138762
[i=6]    139191    278498    415715    555765    694127    832237
el valor   2    se obtuvo    278498 veces    Probabilidad : 0.06
el valor   3    se obtuvo    415715 veces    Probabilidad : 0.08
el valor   4    se obtuvo    555765 veces    Probabilidad : 0.11
el valor   5    se obtuvo    694127 veces    Probabilidad : 0.14
el valor   6    se obtuvo    832237 veces    Probabilidad : 0.17
el valor   7    se obtuvo    833351 veces    Probabilidad : 0.17
el valor   8    se obtuvo    695336 veces    Probabilidad : 0.14
el valor   9    se obtuvo    556418 veces    Probabilidad : 0.11
el valor   10    se obtuvo    417131 veces    Probabilidad : 0.08
el valor   11    se obtuvo    277758 veces    Probabilidad : 0.06
el valor   12    se obtuvo    138341 veces    Probabilidad : 0.03
 


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:
Código
  1. switch(j){
  2. case 1:
  3.   freq[1][1]= freq[1][1] + 1;
  4.   break;
  5. case 2:
  6.   freq[1][2] = freq[1][2] + 1;
  7.   break;
  8. case 3:
  9.   freq[1][3] = freq[1][3] + 1;
  10.   break;
  11. case 4:
  12.   freq[1][4] = freq[1][4] + 1;
  13.   break;
  14. case 5:
  15.   freq[1][5] = freq[1][5] + 1;
  16.   break;
  17. case 6:
  18.   freq[1][6] = freq[1][6] + 1;
  19.   break;
  20. default:
  21.   ;
  22.   break;
  23. }
Todo ese bloque lo puedes sustituir por una sola sentencia:
Código
  1. 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:
Código
  1. if (i == 1)
  2.   freq[1][j]++;
  3. else if (i == 2)
  4.   freq[2][j]++;
  5. else ...
De nuevo todo ese bloque "if" + "switch" se puede reducir a solo:
Código
  1. freq[i][j]++;

Un saludo