Hallo, ich hab hier ein kleines Problem, aber ich kriege es einfach nicht hin und hab mich gewundert ob ihr mir helfen könnt.
Aufgabe:
Zur Erzeugung Gauss-verteilter Zufallszahlen sind folgende Anweisungen notwendig:
d1 = ( (double) rand() ) / RAND_MAX;
d2 = ( (double) rand() ) / RAND_MAX;
n = m + s*(sqrt(-2.0*log(d1))*cos(2.0*M_PI*d2));
a) 1000 Zufallszahlen sollen am Bildschirm ausgegeben werden. m und s sind von der Tastatur
einzulesen.
b) In einem int-Vektor mit 8 Elementen soll die Häufigkeit der in den Intervallen
[-unendlich,m-3s],[m-3s,m-2s],[m-2s,m-s],[m-s,m],[m,m+s],[m+s,m+2s],[m+2s,m+3s], [m+3s,unendlich]
auftretenden Zufallszahlen gezählt und anschließend absolut und prozentual am Bildschirm
ausgegeben werden.
Mein Problem ist, das die Prozentuale Ausgabe nicht stimmt. Da sind einfach keine Nachkommazahlen. Ich hab mehrere Varianten ausprobiert wie hier zu sehen ist.
Danke im Voraus.
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main ()
{
float d1=0, d2=0, n=0, m=0 ,s=0,p0=0,p1=0,p2=0,p3=0,p4=0,p5=0,p6=0,p7=0;
unsigned int i;
int V[8]={0,0,0,0,0,0,0,0};
printf("Geben Sie m ein:");
scanf("%f",&m);
printf("Geben Sie s ein:");
scanf("%f",&s);
for (i=1; i<=1000; i++)
{
d1 = ( (double) rand() ) / RAND_MAX;
d2 = ( (double) rand() ) / RAND_MAX;
n = m + s*(sqrt(-2.0*log(d1))*cos(2.0*M_PI*d2));
if(n<(m-3*s))
V[0]++;
else if((n>=(m-3*s)) && (n<(m-2*s)))
V[1]++;
else if((n>=(m-2*s)) && (n<(m-s)))
V[2]++;
else if((n>=(m-s)) && (n<m))
V[3]++;
else if((n>=m) && (n<(m+s)))
V[4]++;
else if((n>=(m+s)) && (n<(m+2*s)))
V[5]++;
else if((n>=(m+2*s)) && (n<(m+3*s)))
V[6]++;
else if(n>=(m+3*s))
V[7]++;
printf("\nDie %ute. Zahl ist %f\n", i, n);
}
p0=((V[0]*100)/1000);
p1=(V[1]*0,1);
p2=(V[2]/10);
p3=((V[3]*100)/1000);
p4=((V[4]*100)/1000);
p5=((V[5]*100)/1000);
p6=((V[6]*100)/1000);
p7=((V[7]*100)/1000);
printf("\nDie Anzahl der Zahlen zwischen unendlich und %f ist: %i\n",(m-3*s), V[0]);
printf("entspricht %f\n", p0);
printf("Die Anzahl der Zahlen zwischen %f und %f ist: %i\n",(m-3*s),(m-2*s), V[1]);
printf("entspricht %f\n", p1);
printf("Die Anzahl der Zahlen zwischen %f und %f ist: %i\n",(m-2*s),(m-s), V[2]);
printf("entspricht %f\n", p2);
printf("Die Anzahl der Zahlen zwischen %f und %f ist: %i\n",(m-s),m, V[3]);
printf("entspricht %f\n", p3);
printf("Die Anzahl der Zahlen zwischen %f und %f ist: %i\n",m,(m+s), V[4]);
printf("entspricht %d\n", p4);
printf("Die Anzahl der Zahlen zwischen %f und %f ist: %i\n",(m+s),(m+2*s), V[5]);
printf("entspricht %d\n", p5);
printf("Die Anzahl der Zahlen zwischen %f und %f ist: %i\n",(m+2*s),(m+3*s), V[6]);
printf("entspricht %i\n", p6);
printf("Die Anzahl der Zahlen zwischen %f und unendlich ist: %i\n",(m+3*s), V[7]);
printf("entspricht %i\n", p7);
return 0;
}
Aufgabe:
Zur Erzeugung Gauss-verteilter Zufallszahlen sind folgende Anweisungen notwendig:
d1 = ( (double) rand() ) / RAND_MAX;
d2 = ( (double) rand() ) / RAND_MAX;
n = m + s*(sqrt(-2.0*log(d1))*cos(2.0*M_PI*d2));
a) 1000 Zufallszahlen sollen am Bildschirm ausgegeben werden. m und s sind von der Tastatur
einzulesen.
b) In einem int-Vektor mit 8 Elementen soll die Häufigkeit der in den Intervallen
[-unendlich,m-3s],[m-3s,m-2s],[m-2s,m-s],[m-s,m],[m,m+s],[m+s,m+2s],[m+2s,m+3s], [m+3s,unendlich]
auftretenden Zufallszahlen gezählt und anschließend absolut und prozentual am Bildschirm
ausgegeben werden.
Mein Problem ist, das die Prozentuale Ausgabe nicht stimmt. Da sind einfach keine Nachkommazahlen. Ich hab mehrere Varianten ausprobiert wie hier zu sehen ist.
Danke im Voraus.
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main ()
{
float d1=0, d2=0, n=0, m=0 ,s=0,p0=0,p1=0,p2=0,p3=0,p4=0,p5=0,p6=0,p7=0;
unsigned int i;
int V[8]={0,0,0,0,0,0,0,0};
printf("Geben Sie m ein:");
scanf("%f",&m);
printf("Geben Sie s ein:");
scanf("%f",&s);
for (i=1; i<=1000; i++)
{
d1 = ( (double) rand() ) / RAND_MAX;
d2 = ( (double) rand() ) / RAND_MAX;
n = m + s*(sqrt(-2.0*log(d1))*cos(2.0*M_PI*d2));
if(n<(m-3*s))
V[0]++;
else if((n>=(m-3*s)) && (n<(m-2*s)))
V[1]++;
else if((n>=(m-2*s)) && (n<(m-s)))
V[2]++;
else if((n>=(m-s)) && (n<m))
V[3]++;
else if((n>=m) && (n<(m+s)))
V[4]++;
else if((n>=(m+s)) && (n<(m+2*s)))
V[5]++;
else if((n>=(m+2*s)) && (n<(m+3*s)))
V[6]++;
else if(n>=(m+3*s))
V[7]++;
printf("\nDie %ute. Zahl ist %f\n", i, n);
}
p0=((V[0]*100)/1000);
p1=(V[1]*0,1);
p2=(V[2]/10);
p3=((V[3]*100)/1000);
p4=((V[4]*100)/1000);
p5=((V[5]*100)/1000);
p6=((V[6]*100)/1000);
p7=((V[7]*100)/1000);
printf("\nDie Anzahl der Zahlen zwischen unendlich und %f ist: %i\n",(m-3*s), V[0]);
printf("entspricht %f\n", p0);
printf("Die Anzahl der Zahlen zwischen %f und %f ist: %i\n",(m-3*s),(m-2*s), V[1]);
printf("entspricht %f\n", p1);
printf("Die Anzahl der Zahlen zwischen %f und %f ist: %i\n",(m-2*s),(m-s), V[2]);
printf("entspricht %f\n", p2);
printf("Die Anzahl der Zahlen zwischen %f und %f ist: %i\n",(m-s),m, V[3]);
printf("entspricht %f\n", p3);
printf("Die Anzahl der Zahlen zwischen %f und %f ist: %i\n",m,(m+s), V[4]);
printf("entspricht %d\n", p4);
printf("Die Anzahl der Zahlen zwischen %f und %f ist: %i\n",(m+s),(m+2*s), V[5]);
printf("entspricht %d\n", p5);
printf("Die Anzahl der Zahlen zwischen %f und %f ist: %i\n",(m+2*s),(m+3*s), V[6]);
printf("entspricht %i\n", p6);
printf("Die Anzahl der Zahlen zwischen %f und unendlich ist: %i\n",(m+3*s), V[7]);
printf("entspricht %i\n", p7);
return 0;
}
