C语言产生标准正态分布或高斯分布随机数
C语言 产生标准正态分布或高斯分布 随机数
1. 运用中心极限定理(大数定理)
#include
#include #define NSUM 25 double gaussrand()
{
double x = ;
int i;
for(i = ; i < NSUM; i++)
{
x += (double)rand() / RAND_MAX;
} x -= NSUM / 2.0;
x /= sqrt(NSUM / 12.0); return x;
}
2.利用有box 和 muller 提供的,在 knuth的网上讨论过的方法 (比较常用的方法)
如果在 (0,1] 值域内有两个一致的随机数字 U1 和 U2,
可以使用以下两个等式中的任一个算出一个正态分布的随机数字 Z:
Z = R * cos( θ ) 或 Z = R * sin( θ )
其中, R = sqrt(-2 * ln(U2)), θ = 2 * π * U1
正态值 Z 有一个等于 0 的平均值和一个等于 1 的标准偏差,可使用以下等式将 Z 映射到一个平均值为 m、标准偏差为 sd 的统计量 X:
X = m + (Z * sd)
C代码: (计算机编程中, log函数==ln()函数,以e为底的自然对数, log10 才是以10为底的函数)
#include <stdlib.h>
#include <stdio.h>
#define PI 3.141592654double
double gaussrand( )
{
static double U, V;
static int phase = ;
double z; if(phase == )
{
U = rand() / (RAND_MAX + 1.0);
V = rand() / (RAND_MAX + 1.0);
Z = sqrt(-2.0 * log(U))* sin(2.0 * PI * V);
}
else
{
Z = sqrt(-2.0 * log(U)) * cos(2.0 * PI * V);
} phase = - phase;
retrn Z;
}
C++代码:
#include <cstdlib>
#include <cmath>
#include <limits>
double generateGaussianNoise(double mu, double sigma)
{
const double epsilon = std::numeric_limits<double>::min();
const double two_pi = 2.0*3.14159265358979323846; static double z0, z1;
static bool generate;
generate = !generate; if (!generate)
return z1 * sigma + mu; double u1, u2;
do
{
u1 = rand() * (1.0 / RAND_MAX);
u2 = rand() * (1.0 / RAND_MAX);
}
while ( u1 <= epsilon ); z0 = sqrt(-2.0 * log(u1)) * cos(two_pi * u2);
z1 = sqrt(-2.0 * log(u1)) * sin(two_pi * u2);
return z0 * sigma + mu;
}
3 使用最初有marsaglia 提供的方法
#include <stdlib.h>
#include <stdio.h>
double gaussrand()
{
static double V1, V2, S;
static int phase = ;
double X; if(phase == )
{
do{
double U1 = (double)rand() / RAND_MAX;
double U2 = (double)rand() / RAND_MAX; V1 = * U1 - ;
v2 = * U2 - ;
S = V1 * V1 + V2 * V2;
}while( S >= || S ==) X = V1 * sqrt (- * log(S) / S);
}
else
{
X = V2 * sqrt(- * log(S) / S);
} phase = - phase;
return X;
}
参考: http://blog.chinaunix.net/uid-22666248-id-357093.html
https://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform
C语言产生标准正态分布或高斯分布随机数的更多相关文章
- C语言各种标准的
[K&R C] 1978 年,Dennis Ritchie 和 Brian Kernighan 合作推出了<The C Programming Language>的第一版(按照惯例 ...
- c语言中实现从0-1的随机数输出
原文:c语言中实现从0-1的随机数输出 今天晚上同学问了一个巨简单的问题,问我怎么用c语言输出0-1的随机数,可别说,一时之间还想不出来.在写的过程中发现,直接调用random函数还不能实现,用以下方 ...
- C/C++语言的标准库函数malloc/free与运算符new/delete的区别
概括地说 1.malloc与free是C++/C的标准库函数,new/delete是C++的运算符,它们都可用于申请动态内存和释放内存. 2.对于非内部数据类型的对象而言,只用malloc/free无 ...
- C语言的标准库和系统调用
http://blog.csdn.net/yusiguyuan/article/details/23181327 Linux系统调用这部分经常出现两个词:libc库和封装函数,不知道你是否清楚它们的含 ...
- 标准正态分布表(scipy.stats)
0. 标准正态分布表与常用值 Z-score 是非标准正态分布标准化后的 x即 z=x−μσ" role="presentation">z=x−μσz=x−μσ 表 ...
- nodejs选择JavaScript作为开发语言,是因为一般的开发语言的标准库都是带有IO模块的,并且通常这个 模块是阻塞性的,所以nodejs选择了没有自带IO模块的Javascript
Javascrip本身不带IO功能,nodejs选择JavaScript作为开发语言,是因为一般的开发语言的标准库都是带有IO模块的,并且通常这个 模块是阻塞性的,所以nodejs选择了没有自带IO模 ...
- T 分布(近似标准正态分布)
1.1 定义 定义:假设X服从标准正态分布N(0,1),Y服从卡方分布,那么的分布称为自由度为n的t分布,记为. T分布密度函数其中,Gam(x)为伽马函数. 可用于两组独立计量资料的假设检 ...
- C++/C语言的标准库函数与运算符的区别new/delete malloc/free
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存.下面来看他们的区别. 一.操作对象有所不同 malloc与free是C++ ...
- Go语言的标准net库使用
Go语言的标准net库使用 与大多数语言一样,Go的标准库是很全的,因为Go的出现本来就是为了网络通信的高并发实现,所以其相关的网络库封装得很简洁,也更加的易读.这里对使用到的api进行记录. net ...
随机推荐
- Node.js学习——HTTP
HTTP Node.js开发的目的就是为了用JavaScript编写Web服务器程序.因为JavaScript实际上已经统治了浏览器端的脚本,其优势就是有世界上数量最多的前端开发人员.如果已经掌握了J ...
- [Erlang 0120] Know a little Core Erlang
Erlang开发者或多或少都用过或者听说过Core erlang,它是什么样的呢?新建一个测试模块a.erl,如下操作会生成core erlang代码而非a.beam: Eshell V6.0 ...
- db2学习笔记--数据类型对表的影响
创建表的时为列选择合适的数据类型,可以提高数据库性能. 1.选择合适的数据类型,避免出现数据类型转换.例如日期,有人使用字符串来存放日期.时间戳,最后我们还要在程序中使用to_date做数据类型转换, ...
- Spark概述
背景 目前按照大数据处理类型来分大致可以分为:批量数据处理.交互式数据查询.实时数据流处理,这三种数据处理方式对应的业务场景也都不一样: 关注大数据处理的应该都知道Hadoop,而Hadoop的核心为 ...
- Win10全屏看视频时任务栏不隐藏
解决办法: 1.对任务栏鼠标右键点击,选择"任务管理器" 2.在进程选项下找到Windows进程中的Windows资源管理器 3.对Windows资源管理器鼠标右键,选择重新启动
- MVC中在RAZOR 模板里突然了现了 CANNOT RESOLVE SYMBOL ‘VIEWBAG’ 的错误提示
然后在Razor中出现了@ViewBag的不可用,@Url不可用,@Html 这些变量都不能用了. 异常提示: 编译器错误消息: CS0426: 类型“XX.Model.System”中不存在类型名称 ...
- [游戏开发-学习笔记]菜鸟慢慢飞(九)- NGUI- UIWidget(官方说明翻译)
- mysql语句查询练习
1.创建students表mysql> create table ...
- web前端(实习生)之 “百度一面”
2016.3.18,星期五.我经历了我的第一次面试. 不得不说,百度是一个高效的公司,在短短一下午之间我就直接经历了一面二面,说没有压力是假的,还记得在中途等待二面的时候我至少有一小段的时间脑子是卡带 ...
- iOS网络编程
今天的重点是UIWebView.NSURLSession.JSon. 网络编程联网准备:1.在Info.plist中添加AppTransportSecurity类型Dictionary:2.在AppT ...