写一个随机函数使得学生成绩符合正太分布规律
时间: 2024-09-17 20:08:25 浏览: 47
要创建一个随机数生成函数,使其生成的成绩符合正态(或高斯)分布,你可以使用C语言中的`<stdlib.h>`库里的`rand()`函数配合`<time.h>`库中的`srand()`和`clock()`函数来初始化随机数种子。然后,你可以使用泰勒级数的方法近似计算标准正态分布对应的均匀分布随机数,再进行适当转换。
以下是一个简单的示例,假设我们要生成均值为0,标准差为1的正态分布成绩:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 使用泰勒级数计算Z-score对应的均匀分布随机数
double z_to_uniform(double z) {
return (1.0 + erf(z / sqrt(2))) / 2;
}
// 正态分布的累积密度函数近似
double norm_cdf(double x, double mean, double std_dev) {
double z = (x - mean) / std_dev;
return z_to_uniform(z);
}
// 使用Box-Muller法生成二维正态分布随机数
void generate_student_score(double *score) {
srand((unsigned) time(NULL)); // 初始化随机数种子
double u1, u2;
while (1) {
u1 = rand() / (double) RAND_MAX; // 生成[0, 1)的均匀分布随机数
u2 = rand() / (double) RAND_MAX;
// 如果满足正态分布的概率要求,则停止循环
if (u1 * u1 + u2 * u2 <= 1) {
double r = sqrt(-2 * log(u1)); // 根据Box-Muller公式
*score = r * cos(2 * M_PI * u2); // 返回正态分布得分
break;
}
}
}
int main() {
double score;
generate_student_score(&score);
printf("Generated student score: %.2f\n", score);
return 0;
}
```
这个程序首先定义了两个辅助函数`z_to_uniform()`用于计算标准化后的均匀分布随机数,以及`norm_cdf()`用于近似正态分布的累积密度函数。`generate_student_score()`函数则使用Box-Muller方法生成符合标准正态分布的分数。
运行此程序时,每次都会生成一个新的随机学生成绩,符合正态分布规律。
阅读全文