elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  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 1,485 veces)
luchomax

Desconectado Desconectado

Mensajes: 1



Ver Perfil
Problemas con rand
« 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
 


En línea

Kasswed
Colaborador
***
Desconectado Desconectado

Mensajes: 5.295

Rolling Stones


Ver Perfil
Re: Problemas con rand
« Respuesta #1 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í.


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: 1.639


Ver Perfil
Re: Problemas con rand
« Respuesta #2 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
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Funcion Rand() con strings en PHP
PHP
Riki_89D 5 9,502 Último mensaje 9 Marzo 2009, 14:37 pm
por cassiani
rand() algo prohibido
Programación C/C++
Komodo 6 3,250 Último mensaje 2 Septiembre 2010, 11:20 am
por Komodo
Programa funcion rand()
Programación C/C++
hocius 4 2,655 Último mensaje 9 Octubre 2010, 22:30 pm
por hocius
[Solucionado]Problema con rand() y arreglos.
Programación C/C++
GROV 2 2,936 Último mensaje 16 Julio 2012, 21:32 pm
por GROV
Rellenar con rand no me funciona
.NET (C#, VB.NET, ASP)
luis456 7 3,297 Último mensaje 2 Abril 2015, 05:33 am
por luis456
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines