C语言实现随机生成正态分布数据

C语言中可以通过rand函数生成满足均匀分布的随机数,但是生成满足正太分布的随机数就没有那么简单了,下面介绍一种常用的产生随机生成正态分布数据的算法,并提供C语言代码。

Box-Muller方法
基本思想: 先得到服从均匀分布的随机数; 然后再将服从均匀分布的随机数转变为服从正态分布.Box-Muller 算法隐含的原理非常深奥,但结果却是相当简单。
Box-Muller方法是以两组独立的随机数U和V,这两组数在(0,1]上均匀分布,用U和V生成两组独立的标准正太分布随机变量X和Y:

X = − 2 ln ⁡ U cos ⁡ ( 2 π V ) X = \sqrt{-2\ln U} \cos{(2\pi V)} X=2lnU cos(2πV), Y = − 2 ln ⁡ U sin ⁡ ( 2 π V ) Y = \sqrt{-2\ln U} \sin{(2\pi V)} Y=2lnU sin(2πV)

C语言实现:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
 
float gaussrand_NORMAL() {
	static float V1, V2, S;
	static int phase = 0;
	float X;


	if (phase == 0) {
		do {
			float U1 = (float) rand() / RAND_MAX;
			float U2 = (float) rand() / RAND_MAX;


			V1 = 2 * U1 - 1;
			V2 = 2 * U2 - 1;
			S = V1 * V1 + V2 * V2;
		} while (S >= 1 || S == 0);


		X = V1 * sqrt(-2 * log(S) / S);
	} else
		X = V2 * sqrt(-2 * log(S) / S);


	phase = 1 - phase;


	return X;
}


float gaussrand(float mean, float stdc) {
	return mean + gaussrand_NORMAL() * stdc;
}


int main() 
{
	float mean = 0;
	float stdc = 1;
	float data = 0;
	
	for(int i=0; i<100; ++i){
		data = gaussrand(0, 1);
		printf("%f\t", data);
	}
}

运行结果:

在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TransientYear

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值