我有一个问题,我需要在-3&之间生成1000高斯分布数。 3,然后在直方图上绘制它们。到目前为止,这是我的代码:
全局声明的数组:
double s, u[1000], v[1000], z;
int gauss[1000];
double transformed[2000];
void run(){
int max;
while(1){
srand( time(NULL) );
generateec();
transform();
max = findMax();
plot( max );
getchar();
}}
void plot ( int max )
{
int j, s;
for ( j=0; j<maxPlus; j++ )
{
printf("%3d (%5d) > ", j, gauss[j] );
for ( s=0; s<transformed[j]*barWidth/max; s++ ) printf("|");
printf("\n");
}
}
int findMax()
{
int j;
int max = transformed[0];
for ( j=1; j < maxPlus; j++ )
{
if ( transformed[j] > max )
max = transformed[j];
}
return max;
}
void generateec(){
srand( time(NULL) );
for(int i = 0; i < 1000; ++i)
{
u[i] = (double)rand()/(double)(RAND_MAX);
v[i] = (double)rand()/(double)(RAND_MAX);
}
}
void transform(){
for(int i = 0; i < 1000; ++i)
{
if( (u[i] + v[i]) > 0){
s = (u[i]*u[i])+(v[i]*v[i]);
transformed[2*i] = sqrt(-2.0 * log(u[i])) * cos(2 * pi * v[i]);
transformed[2*i+1] = sqrt(-2.0 * log(u[i])) * sin(2 * pi * v[i]);
}
}
printf("%d %d %d \n", transformed[0], transformed[500], transformed[600]);
}
我从main函数调用run函数,生成数字,转换它们,然后绘制它们。出于某种原因,我在运行它时会得到全零。我不知道为什么,任何帮助都会很棒,
谢谢你们!
答案 0 :(得分:0)
我还在押注它的阵列。如果你看一下u和v,它们就不会在全球范围内宣布。在哪里宣布?他们分配给了什么?
答案 1 :(得分:0)
我将假设u
,v
,transformed
已正确初始化为(否则会导致崩溃)。仔细检查一下,这是你的问题:
printf("%d %d %d \n", transformed[0], transformed[500], transformed[600]);
应该是
printf("%f %f %f \n", transformed[0], transformed[500], transformed[600]);
当然,数组应声明为double
或float
。截断可能是这里的罪魁祸首。
答案 2 :(得分:0)
我尝试使用缺少的声明来完成代码,并且Box-Muller转换似乎正在运行。
我相信你的问题出现在数组的声明中,你从发布的代码中遗漏了这些声明。
以下是修改后的程序:(使用gcc -std=c99 -lm boxmuller.c -o boxmuller
编译)
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
double v[1000];
double u[1000];
double transformed[2000];
void generateec() {
//srand( time(NULL) );
for(int i = 0; i < 1000; ++i)
{
u[i] = (double)rand()/(double)(RAND_MAX);
v[i] = (double)rand()/(double)(RAND_MAX);
}
}
void transform(){
static const double pi = 3.14159265358979323846;
for(int i = 0; i < 1000; ++i)
{
if( (u[i] + v[i]) > 0) {
double s = (u[i]*u[i])+(v[i]*v[i]);
transformed[2*i] = sqrt(-2.0 * log(u[i])) * cos(2 * pi * v[i]);·
transformed[2*i+1] = sqrt(-2.0 * log(u[i])) * sin(2 * pi * v[i]);··
}
}
printf("%f %f %f \n", transformed[0], transformed[500], transformed[600]);
}
void run(){
int max;
srand( time(NULL) );
while(1){
generateec();
transform();
//max = findMax();
//plot( max );
getchar();··
}
}
int main(int argc, char** argv) {
run();
return 0;
}
其他一些要点: