gpt4 book ai didi

c - 高斯分布变换,用直方图绘制

转载 作者:行者123 更新时间:2023-11-30 19:48:52 25 4
gpt4 key购买 nike

我有一个问题,我需要生成 -3 和 3 之间的 1000 个高斯分布数,然后将它们绘制在直方图上。到目前为止,这是我的代码:

全局声明的数组:

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]);

}

我从主函数调用 run 函数,生成数字,转换它们,然后绘制它们。由于某种原因,当我运行它时,我得到的全是零。我不知道为什么,任何帮助都会很棒,

谢谢大家!

最佳答案

我尝试使用缺少的声明来完成您的代码,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;
}

一些补充要点:

  • 您可能不想在每次迭代时使用计时器重新初始化随机数生成器。
  • 您可以像整数一样打印 float 。
  • 变换生成具有 N(0,1) 分布的数字,即平均值 = 0、标准差 = 1 的高斯分布。

关于c - 高斯分布变换,用直方图绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16489669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com