第一类舍选法(也称为拒绝采样法)是一种常见的随机数生成方法,其基本思想是在一个包围目标分布的矩形内随机生成点,然后判断这些点是否在目标分布下方,如果在则保留,否则舍去。这个过程可以用C语言编程实现。
假设我们要生成的目标分布是概率密度函数为f(x),在区间[a,b]内的随机数。我们可以先找到一个上界M,使得在区间[a,b]内,f(x) <= M。然后在矩形[a,b] x [0,M]内随机生成点(x,y),如果y <= f(x),则保留x作为随机数,否则舍去。这个过程可以重复进行,直到生成足够数量的随机数。
下面是一个使用第一类舍选法生成10000个满足概率密度函数的随机数的C语言代码示例:
“`c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
double f(double x) {
// 定义目标分布的概率密度函数
return exp(-x*x/2)/sqrt(2*M_PI);
}
int main() {
int n = 10000; // 需要生成的随机数数量
double a = -5, b = 5; // 区间[a,b]
double M = 1.0/sqrt(2*M_PI); // 上界M
double x, y;
int count = 0; // 记录生成的随机数数量
srand(time(NULL)); // 初始化随机数种子
while (count < n) {
x = (double)rand()/RAND_MAX*(b-a)+a; // 在区间[a,b]内随机生成x
y = (double)rand()/RAND_MAX*M; // 在区间[0,M]内随机生成y
if (y <= f(x)) {
printf("%lf\n", x); // 输出符合要求的随机数
count++;
}
}
return 0;
}
“`
该方法的效率取决于上界M的选择,M越小,需要生成的随机数数量就越多,效率就越低。在实际应用中,需要根据目标分布的特点选择合适的M值,以达到最优的效率。