C语言生成1000个正态随机数,然后用图表示它的分布。
时间: 2024-04-29 13:23:27 浏览: 77
以下是使用C语言生成1000个正态随机数,并用图表示分布的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define PI 3.14159265358979323846
double normal_distribution(double mean, double std_dev) {
double u1 = rand() / ((double) RAND_MAX + 1);
double u2 = rand() / ((double) RAND_MAX + 1);
double z = sqrt(-2.0 * log(u1)) * cos(2.0 * PI * u2);
return mean + std_dev * z;
}
int main() {
srand(time(NULL));
double mean = 0.0;
double std_dev = 1.0;
int n = 1000;
double data[n];
for (int i = 0; i < n; i++) {
data[i] = normal_distribution(mean, std_dev);
}
// 计算数据的最小值和最大值
double min = data[0];
double max = data[0];
for (int i = 1; i < n; i++) {
if (data[i] < min) {
min = data[i];
}
if (data[i] > max) {
max = data[i];
}
}
// 计算每个区间的频率
int num_intervals = 20;
double interval_size = (max - min) / num_intervals;
int freq[num_intervals];
for (int i = 0; i < num_intervals; i++) {
freq[i] = 0;
}
for (int i = 0; i < n; i++) {
int interval_index = (int) ((data[i] - min) / interval_size);
if (interval_index >= num_intervals) {
interval_index = num_intervals - 1;
}
freq[interval_index]++;
}
// 打印每个区间的频率
for (int i = 0; i < num_intervals; i++) {
printf("%d: %d\n", i, freq[i]);
}
// 用图表示分布
printf("\n");
for (int i = num_intervals - 1; i >= 0; i--) {
double interval_start = min + i * interval_size;
double interval_end = interval_start + interval_size;
printf("%6.2f - %6.2f | ", interval_start, interval_end);
int bar_length = (int) (80.0 * freq[i] / n);
for (int j = 0; j < bar_length; j++) {
printf("*");
}
printf("\n");
}
return 0;
}
```
代码中使用了Box-Muller转换来生成正态分布的随机数,使用了20个等宽的区间来计算频率。最后,使用文本形式的直方图来展示数据的分布情况。可以将输出复制到文本编辑器中,并使用等宽字体查看直方图。
阅读全文