elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 02:57  


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Problemas con rand
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problemas con rand  (Leído 162 veces)
luchomax

Desconectado Desconectado

Mensajes: 1



Ver Perfil
Problemas con rand
« en: 1 Febrero 2012, 23:35 »

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
 


En línea
Kasswed
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.202


Andalucía


Ver Perfil
Re: Problemas con rand
« Respuesta #1 en: 2 Febrero 2012, 00:18 »

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í.


En línea

"He who allows himself to be insulted, deserves to be."

Repórtame cualquier falta a las normas del foro por mensaje privado.
rir3760


Desconectado Desconectado

Mensajes: 382


Ver Perfil
Re: Problemas con rand
« Respuesta #2 en: 2 Febrero 2012, 00:45 »

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
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:
Código
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
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:
Código
freq[i][j]++;

Un saludo
En línea

The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Auxilio!!! con rand
Programación C/C++
***ElprrogramadorRASTA*** 1 369 Último mensaje 1 Diciembre 2007, 16:29
por EvilGoblin
rand()%
Programación C/C++
chillinfart 3 611 Último mensaje 8 Diciembre 2007, 04:24
por chillinfart
Funcion rand « 1 2 »
Programación C/C++
Pendenerds 16 1,983 Último mensaje 20 Octubre 2008, 07:23
por Sin Nick xD
Ayuda con la función rand.
Programación C/C++
Felipe_Henriquez 5 989 Último mensaje 31 Octubre 2011, 20:20
por Queta
programas con srand y rand
Programación C/C++
lokita_sarah 1 247 Último mensaje 1 Diciembre 2011, 04:28
por ralymontes
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines