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

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Numeros Aleatorios-Simulacion
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Numeros Aleatorios-Simulacion  (Leído 2,302 veces)
pacman22

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Numeros Aleatorios-Simulacion
« en: 17 Noviembre 2014, 01:46 am »

Estoy haciendo una simulación de una inversión de proyectos , y la pregunta es si uso srand(time(null)), corro el riesgo que se ejecute muy rapido y tome el mismo tiempo de sistema y termine usando la misma semilla?, entonces decidi   poner srand(i) y usar el ciclo para generar distinas semillas, pero me genera los mismos numeros aleatorios . Aqui el codigo por las dudas

Código:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
/*Estructura de datos para numeros aleatorios*/
double numAlea[5];
/*Estructura de dato para el flujo de fondos*/
double matFlujos[6][11];
/*Estructura de datos para variables*/
/*a-b-c*/
double vIAF[3]={3500000,4000000,5000000};
double vIAT[3]={300000,400000,500000};
double Ventas[3]={3000000,3800000,4000000};
double costosSA[3]={400000,500000,600000};
double vInf[3]={0.4,0.3,0.25};

/*Variables iniciales*/
double vr;
double impGanancias;

/*Variables auxiliares*/
int i,j;
double IAF,IAT,aux,inf,amort,sFFT;

/*Archivo*/
FILE* ptFichero;

ptFichero = fopen("FFTactualizados.txt", "wt");
vr=0.8;
impGanancias=0.65;
/*10 mil repeticiones, para generar las TIR*/
for (i=0;i<3;i++)
{
printf("\n %i",i);
srand(i);

for (j=0;j<5;j++)
{
numAlea[j]=( (rand()%100000) /100000);
}
/*Cargar valor de inversion activo fijo*/
if (numAlea[0]< (vIAF[1]-vIAF[0])/(vIAF[2]-vIAF[0]))
IAF=vIAF[0]+sqrt(numAlea[0]*(vIAF[1]-vIAF[0])*(vIAF[2]-vIAF[0]));
else
IAF=vIAF[2]-sqrt((1-numAlea[0])*(vIAF[2]-vIAF[0])*(vIAF[2]-vIAF[1]));

/*Cargar valor de inversion en activo de trabajo*/
if (numAlea[1]< (vIAT[1]-vIAT[0])/(vIAT[2]-vIAT[0]))
IAT=vIAT[0]+sqrt(numAlea[1]*(vIAT[1]-vIAT[0])*(vIAT[2]-vIAT[0]));
else
IAT=vIAT[2]-sqrt((1-numAlea[1])*(vIAT[2]-vIAT[0])*(vIAT[2]-vIAT[1]));

/*Calcular la amortizacion*/
amort=((IAF*vr)/10);

/*Cargar valor de la inflacion*/
if (numAlea[4]< (vInf[1]-vInf[0])/(vInf[2]-vInf[0]))
inf=vInf[0]+sqrt(numAlea[4]*(vInf[1]-vInf[0])*(vInf[2]-vInf[0]));
else
inf=vInf[2]-sqrt((1-numAlea[4])*(vInf[2]-vInf[0])*(vInf[2]-vInf[1]));

/*Cargar la fila del ingreso de las ventas*/
if (numAlea[2]<( (Ventas[1]-Ventas[0]/Ventas[2]-Ventas[0])))
aux=Ventas[0]+sqrt(numAlea[2]*(Ventas[1]-Ventas[0])*(Ventas[2]-Ventas[0]));
else
aux=Ventas[2]-sqrt((1-numAlea[2])*(Ventas[2]-Ventas[0])*(Ventas[2]-Ventas[1]));
for (j=1;j<11;j++)
matFlujos[0][j]=aux;

/*Cargar la fila de los costos totales*/
if (numAlea[3]<((costosSA[1]-costosSA[0])/(costosSA[2]-costosSA[0])))
aux=costosSA[0]+sqrt(numAlea[3]*(costosSA[1]-costosSA[0])*((costosSA[2]-costosSA[0])));
else
aux=costosSA[2]-sqrt((1-numAlea[3])*((costosSA[2]-costosSA[0])*((costosSA[2]-costosSA[1]))));
aux=aux+amort;
for (j=1;j<11;j++)
matFlujos[1][j]=aux;

/*Cargar fila de la utilidad neta*/
for (j=1;j<11;j++)
matFlujos[2][j]=(matFlujos[0][j]-matFlujos[1][j])*impGanancias;

/*Cargar fila de FFO*/
for (j=1;j<10;j++)
matFlujos[3][j]=matFlujos[2][j]+amort;
matFlujos[3][10]=((matFlujos[2][10])+(IAT)+(IAF*0.2)+amort);

/*Cargar fila del FFT*/
matFlujos[4][0]=-(IAF+IAT);
for (j=1;j<10;j++)
matFlujos[4][j]=matFlujos[2][j]+amort;
matFlujos[4][10]=(matFlujos[2][10])+(IAF*0.2)+IAT+amort;

/*Cargar el FFT actualizado con la inflacion*/
for (j=0;j<11;j++)
matFlujos[5][j]=matFlujos[4][j]/pow((1+inf),j);

/*Sumar los flujos de fondos operativos
sFFT=0;
for (j=0;j<12;j++)
sFFT=sFFT+matFlujos[5][j];*/
/*Copiar al archivo*/
for (j=0;j<11;j++)
fprintf(ptFichero, "%f ", matFlujos[5][j]);
fprintf(ptFichero, "\n", "");
}
fclose(ptFichero);
return 0;
}


En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Numeros Aleatorios-Simulacion
« Respuesta #1 en: 17 Noviembre 2014, 01:51 am »

srand genera un numero aleatorio a base de una semilla, es decir, es un calculo matematico a base del numero introducido... puedes aplicar sumar el tiempo al ciclo para asegurarte tener 2 factores de aletoriedad y no se repita por tiempo o ciclo


En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
pacman22

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Numeros Aleatorios-Simulacion
« Respuesta #2 en: 17 Noviembre 2014, 01:53 am »

Estuve depurando el codigo y vi que en esta parte numAlea[j]=( (rand()%100000) /100000) , solo genera 0's , no entiendo el por q, necesito generar numeros entre [0,1)
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Numeros Aleatorios-Simulacion
« Respuesta #3 en: 17 Noviembre 2014, 02:12 am »

Estuve depurando el codigo y vi que en esta parte numAlea[j]=( (rand()%100000) /100000) , solo genera 0's , no entiendo el por q
Porque el resultado de "rand() % 100000" esta en el rango [0, 100000) y la división entera descarta la parte decimal, por ello el resultado de "(rand() % 100000) / 100000" siempre es cero.

necesito generar numeros entre [0,1)
Para ello debes utilizar "rand() / (RAND_MAX + 1.0)".

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
pacman22

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Numeros Aleatorios-Simulacion
« Respuesta #4 en: 17 Noviembre 2014, 21:41 pm »

Porque el resultado de "rand() % 100000" esta en el rango [0, 100000) y la división entera descarta la parte decimal, por ello el resultado de "(rand() % 100000) / 100000" siempre es cero.
Para ello debes utilizar "rand() / (RAND_MAX + 1.0)".

Un saludo
Con una sola semilla que genere en srand , alcanza para generar 50 mil números aleatorios independientes?
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Numeros Aleatorios-Simulacion
« Respuesta #5 en: 18 Noviembre 2014, 02:19 am »

El numero de valores únicos que puede generar la función rand es igual a RAND_MAX + 1 ...

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
NUMEROS ALEATORIOS EN VB
Programación Visual Basic
WCIETE 3 4,013 Último mensaje 30 Agosto 2005, 01:19 am
por Slasher-K
Numeros aleatorios
Programación Visual Basic
Gleper 2 2,234 Último mensaje 3 Noviembre 2007, 14:40 pm
por Gleper
NUMEROS ALEATORIOS
Java
ponichan 6 10,258 Último mensaje 19 Abril 2008, 21:35 pm
por sapito169
Números Aleatorios!
Programación Visual Basic
ka0s 5 4,439 Último mensaje 9 Abril 2009, 04:27 am
por ka0s
Números Aleatorios
Programación C/C++
Kropt32 2 2,976 Último mensaje 2 Agosto 2010, 20:43 pm
por do-while
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines