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的网上讨论过的方法 (比较常用的方法)

   
Box-Muller,一般是要得到服从正态分布的随机数,
 
 基本思想: 先得到服从均匀分布的随机数;  然后再将服从均匀分布的随机数转变为服从正态分布.
 
Box-Muller 是产生随机数的一种方法。Box-Muller 算法隐含的原理非常深奥,但结果却是相当简单。

 

如果在 (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语言产生标准正态分布或高斯分布随机数的更多相关文章

  1. C语言各种标准的

    [K&R C] 1978 年,Dennis Ritchie 和 Brian Kernighan 合作推出了<The C Programming Language>的第一版(按照惯例 ...

  2. c语言中实现从0-1的随机数输出

    原文:c语言中实现从0-1的随机数输出 今天晚上同学问了一个巨简单的问题,问我怎么用c语言输出0-1的随机数,可别说,一时之间还想不出来.在写的过程中发现,直接调用random函数还不能实现,用以下方 ...

  3. C/C++语言的标准库函数malloc/free与运算符new/delete的区别

    概括地说 1.malloc与free是C++/C的标准库函数,new/delete是C++的运算符,它们都可用于申请动态内存和释放内存. 2.对于非内部数据类型的对象而言,只用malloc/free无 ...

  4. C语言的标准库和系统调用

    http://blog.csdn.net/yusiguyuan/article/details/23181327 Linux系统调用这部分经常出现两个词:libc库和封装函数,不知道你是否清楚它们的含 ...

  5. 标准正态分布表(scipy.stats)

    0. 标准正态分布表与常用值 Z-score 是非标准正态分布标准化后的 x即 z=x−μσ" role="presentation">z=x−μσz=x−μσ 表 ...

  6. nodejs选择JavaScript作为开发语言,是因为一般的开发语言的标准库都是带有IO模块的,并且通常这个 模块是阻塞性的,所以nodejs选择了没有自带IO模块的Javascript

    Javascrip本身不带IO功能,nodejs选择JavaScript作为开发语言,是因为一般的开发语言的标准库都是带有IO模块的,并且通常这个 模块是阻塞性的,所以nodejs选择了没有自带IO模 ...

  7. T 分布(近似标准正态分布)

    1.1      定义 定义:假设X服从标准正态分布N(0,1),Y服从卡方分布,那么的分布称为自由度为n的t分布,记为. T分布密度函数其中,Gam(x)为伽马函数. 可用于两组独立计量资料的假设检 ...

  8. C++/C语言的标准库函数与运算符的区别new/delete malloc/free

    malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存.下面来看他们的区别. 一.操作对象有所不同 malloc与free是C++ ...

  9. Go语言的标准net库使用

    Go语言的标准net库使用 与大多数语言一样,Go的标准库是很全的,因为Go的出现本来就是为了网络通信的高并发实现,所以其相关的网络库封装得很简洁,也更加的易读.这里对使用到的api进行记录. net ...

随机推荐

  1. win2003 Enterprise x64 Edtion中的DCOM服务找不到WORD应用程序

    打开注册表,找到以下健值 HKEY_CLASSES_ROOT\AppID\{00020906-0000-0000-C000-000000000046} HKEY_CLASSES_ROOT\CLSID\ ...

  2. JS导出excel 兼容ie、chrome、firefox

    运用js实现将页面中的table导出为excel文件,页面显示如下: 导出的excel文件显示如下: 实现代码: <!DOCTYPE html> <html> <head ...

  3. VMware中CPU分配不合理以及License限制引起的SQL Scheduler不能用于查询处理

    有一台SQL Server(SQL Server 2014 标准版)服务器中的scheduler_count与cpu_count不一致,如下截图所示: SELECT  cpu_count ,      ...

  4. 使Python IDLE也变得高颜值

    初学Python,大家应该都是用Python自带的IDLE了,我们可以让他颜值高一些,这样敲出的代码就赏心悦目,比如像下面这样:   我们首先要找到名为config-highlight.cfg的文件, ...

  5. 《WePayUI组件设计的秘密》——2016年第一届前端体验大会分享

    本文是博主参加第一届前端体验大会 | 物勒工名做的分享<WePayUI组件设计的秘密>,内容主要分为2个部分: 一.浅析UI库/框架的未来 讨论的UI库或者框架,主要包含展示和交互的css ...

  6. [LeetCode] Consecutive Numbers 连续的数字

    Write a SQL query to find all numbers that appear at least three times consecutively. +----+-----+ | ...

  7. Underscore 整体架构浅析

    前言 终于,楼主的「Underscore 源码解读系列」underscore-analysis 即将进入尾声,关注下 timeline 会发现楼主最近加快了解读速度.十一月,多事之秋,最近好多事情搞的 ...

  8. 5G系统架构

    原文标题:迈向5G之路,颠覆性的5G系统架构?   本文部分图片,资料摘自<迈向5G C-RAN:需求.架构与挑战> 突如一夜春风来,随着Polar码与LDPC码作为5G编码候选方案,通信 ...

  9. [CI] 使用Jenkins自动编译部署web应用

    写在前面 初步接触持续集成自动化过程,本篇主要介绍基于Jenkins实现持续集成的方式,通过案例介绍线上自动编译及部署的配置过程 持续集成 持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作 ...

  10. DBoW2库介绍

    DBoW2库是University of Zaragoza里的Lopez等人开发的开源软件库. 由于在SLAM回环检测上的优异表现(特别是ORB-SLAM2),DBoW2库受到了广大SLAM爱好者的关 ...