Dev - C++ - Ayuda con Rand

   
Vista:

Ayuda con Rand

Publicado por francisco (5 intervenciones) el 23/09/2014 05:07:18
Hola, debo hacer un programa que genere numeros aleatorios, el problema surge cuando al generarlos estos siempre me dan entre 250000 y 300000, siendo que deberian dar entre 250000 y 900000, éste seria el unico problema que presenta porfavor alguien que me señale mi error gracias de antemano dejo el programa tal cual lo tengo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include<stdio.h>
#include<conio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
main()
{
	char nombre[20],nombremenor[20],nombremayor[20];
	int n,i,anosTrabajo,edad,edadmenor,edadmayor,sueldobruto,sueldoliquido,sueldomayor=0,sueldomenor=1000000,sumasueldos=0,promediosueldos,c1=0,c2=0;
	srand(time(0));
 
	printf("\n Ingrese Cantidad de Trabajadores: ");
	scanf("%d",&n);
	for (i=1;i<=n;i++)
	{
		printf("\n                   ");
		printf("\n Nombre del Trabajador %d: ",i);
		scanf("%s",&nombre);
		printf("\n A¤os de trabajo: ");
		scanf("%d",&anosTrabajo);
		sueldobruto=(rand()%650001+250000);
		edad=(rand()%48+18);
		printf("\n %s a trabajado %d a¤os en la empresa con %d a¤os de edad \n un sueldo bruto de  $%d",nombre,anosTrabajo,edad,sueldobruto);
		sueldoliquido=sueldobruto*0.75;
		printf(" y un sueldo liquido de $%d",sueldoliquido);
	    if(anosTrabajo<=4)
	        c1++;
	    if(anosTrabajo>=5&&sueldoliquido<300000)
	        c2++;
	    if(sueldobruto>sueldomayor)
		{
	    	strcpy(nombremayor,nombre);
	    	sueldomayor=sueldobruto;
	    	edadmayor=edad;
	    }
	    if(sueldobruto<sueldomenor)
	    {
	    	strcpy(nombremenor,nombre);
	    	sueldomenor=sueldobruto;
	    	edadmenor=edad;
	    }
	    sumasueldos=sumasueldos+sueldobruto;
	}
	printf("\n\n %d son el numero de trabajadores que llevan menos de 5 a¤os en la empresa",c1);
	printf("\n\n %d son el numero de trabajadores que llevan mas de 4 a¤os en la empresa\n y tienen un sueldo liquido menor a $300000",c2);
	printf("\n\n %s es el trabajador que menos gana con %d a¤os de edad \n y un sueldo de $%d",nombremenor,edadmenor,sueldomenor);
	printf("\n\n %s es el trabajador que mas gana con %d a¤os de edad \n y un sueldo de $%d",nombremayor,edadmayor,sueldomayor);
	printf("\n\n La empresa gasta $%d en sueldos",sumasueldos);
	promediosueldos=sumasueldos/n;
	printf("\n El promedio de lo que gasta la empresa en sueldos es $%d",promediosueldos);
	getche();
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ayuda con Rand

Publicado por Pico (24 intervenciones) el 23/09/2014 11:10:42
No pueden salirte números entre 0 y 650000 con rand()/650000 si MAX_RAND vale lo que suele valer, 32767.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con Rand

Publicado por Martín (65 intervenciones) el 23/09/2014 11:27:30
El problema está en esta línea:
1
sueldobruto=(rand()%650001+250000);

La función rand() devuelve un int entre 0 y RAND_MAX, que es una constante definida en stdlib.h (para C), o en cstdlib (para C++).

El valor de RAND_MAX depende de cada compilador, pero suele estar definida como 32767, que es el mínimo exigido por el lenguaje.

Entonces, cuando calculas sueldobruto, en la mayoría de los compiladores obtendrás un valor entre 250000 y 282767.

Una posible solución podría ser:

1
2
double m = (double)rand()/(double)(RAND_MAX);   // un double generado al azar entre 0 y 1 
	int sueldobruto = double(900000-250000)*m + 250000;


Martín
Profesor de C++
(Consultas particulares por e-mail)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con Rand

Publicado por francico (5 intervenciones) el 23/09/2014 12:31:37
Gracias por la ayuda me sirvio bastante, eso de el rand_max no e algo que no han explicado, quizas el profesor esperaba que se generaran sueldos en ese intervalo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con Rand

Publicado por Pico (24 intervenciones) el 24/09/2014 12:59:21
El problema de la solución de Martín es que, aunque sí genera números entre 250000 y 900000, no genera todos, pues trabaja con fracciones de 32767, dado que los números de los que parte son fracciones de 32767. Yo lo que haría es multiplicar o sumar el resultado de rand() hasta que pueda dar un resultado entre 0 y 1000000, por ejemplo, y luego operar como hacías al principio.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con Rand

Publicado por Martín (65 intervenciones) el 25/09/2014 12:48:09
Hola; con la primera parte de tu comentario estoy completamente de acuerdo, la solución que propongo no es completa, en el sentido de que no se van a generar más que 32767 números distintos dentro del rango correcto, pero no estoy de acuerdo con la segunda parte, porque sumando o multiplicando lo que resulte de rand() de todos modos siempre va a resultar en la misma cantidad de variaciones. El problema real está en la naturaleza de rand(), que sólo debe usarse como una primera aproximación al problema de la generación de números pseudoaleatorios. Para una solución más apropiada está std::uniform_int_distribution, aunque sólo disponible a partir de C++11. Otra posibilidad es utilizar algoritmos especializados, que hay muy buenos también.
De todos modos, creo que a los efectos de esta simulación, generar 32766 salarios distintos dentro del rango establecido es suficientemente realista.
Saludos,
Martín
Profesor de C++
(Consultas particulares por e-mail)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con Rand

Publicado por Pico (24 intervenciones) el 25/09/2014 13:11:14
Si yo sumo el resultado de 100 llamadas a rand() obtengo un número aleatorio entre 0 y 3.276.700. Con eso tiene de sobra para lo que busca francisco.

Yo para eso lo que usaría es la instrucción de generación de números aleatorios de la cpu de Intel, rdrand.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar