随机数的生成:均匀分布、正态、泊松 、瑞利

均匀分布:线性同余法

正态分布:sum-of-12 method

其他分布:逆变换法

/*****************************************
Copyright (c) 2015 Jingshuang Hu  

@filename:demo.c
@datetime:2015.10.18
@author:HJS
@e-mail:[email protected]
@blog:http://blog.csdn.net/hujingshuang
*****************************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/**********************************************************************************************/
void menu(void);
double *Uniform_Distribution(unsigned int length, unsigned int num);
void Demo_Gaussian(void);
double *Gaussian_Distribution(double miu, double sigma, int length);
void Demo_Rayleigh(void);
double *Rayleigh_Distribution(double sigma, int length);
void Demo_Poisson(void);
int *Poisson_Distribution(double lamda,unsigned int length);
/**********************************************************************************************/
int main()
{
	menu();
	return 0;
}
/**********************************************************************************************/
void menu(void)
{
	int num = 0, flag = 0;
	while(!flag)
	{
		printf("---------random variates---------\n");
		printf("1.gaussian distribution\n2.rayleigh distribution\n3.poisson distribution\n4.exit\n");
		printf("---------------------------------\nyour choice<1,2,3,4>:");
		scanf("%d", &num);
		switch(num)
		{
			case 1:	Demo_Gaussian();break;
			case 2:	Demo_Rayleigh();break;
			case 3:	Demo_Poisson();	break;
			case 4:	flag = 1;		break;
			default:				break;
		}
		printf("Save success,press any key to continue.\n");
		getchar();getchar();
		fflush(stdin);
		system("cls");
	}
}
/**********************************************************************************************/
//uniform
double *Uniform_Distribution(unsigned int length, unsigned int num)
{
	unsigned int i = 0;
	unsigned int xn = (unsigned int)pow(2, 31);
	unsigned int lamda = (unsigned int)pow(7, 5);
	unsigned int base = (unsigned int)pow(2, 31) - 1;
	double *uniform = (double *)malloc(length * sizeof(double));
	for (i = 0; i < num; i++)
	{
		xn = (lamda * xn) % base;
	}
	for (i = 0; i < length; i++)
	{
		xn = (lamda * xn) % base;
		uniform[i] = (double)xn / (double)base;
	}
	return uniform;
}
/**********************************************************************************************/
/**********************************************************************************************/
//demo gaussian
void Demo_Gaussian(void)
{
	int i = 0, length = 0;
	double miu = 0, sigma = 1.0, *gaussian;
	char filename[50];
	FILE *fp;
	printf("length=");	scanf("%d", &length);	//length
	printf("miu=");		scanf("%lf", &miu);		//miu
	printf("sigma=");	scanf("%lf", &sigma);	//sigma
	sprintf(filename, "Gaussian_%d_%d_%d.txt", (int)(miu * 100), (int)(sigma * 100), length);
	gaussian = Gaussian_Distribution(miu, sigma, length);
	fp = fopen(filename,"w");
	for (i = 0; i < length; i++)
	{
		fprintf(fp, "%lf\n", gaussian[i]);//fscanf(fp, "%lf", &gaussian[i]);//read data
	}
	fclose(fp);
}
/*********************************************/
//Sum-of-12 Method
double *Gaussian_Distribution_Standard(int length)
{
	int i = 0, j = 0;
	double *gaussian = (double *)malloc(length * sizeof(double));
	double *(uniform[12]);
	for (i = 0; i < length; i++)
	{
		uniform[i] = Uniform_Distribution(length, (i + 1) * length);
	}
	for (j = 0; j < length; j++)
	{
		for (i = 0; i < 12; i++)
		{
			gaussian[j] = gaussian[j] + uniform[i][j];
		}
		gaussian[j] = gaussian[j] - 6.0;
	}
	return gaussian;
}
//N(miu,sigma)
double *Gaussian_Distribution(double miu, double sigma, int length)
{
	int i = 0;
	double *gaussian_standard = Gaussian_Distribution_Standard(length);
	double *gaussian = (double *)malloc(length * sizeof(double));
	for (i = 0; i < length; i++)
	{
		gaussian[i] = gaussian_standard[i] * sqrt(sigma) + miu;
	}
	return gaussian;
}
/**********************************************************************************************/
/**********************************************************************************************/
void Demo_Rayleigh(void)
{
	int i = 0, length = 0;
	char filename[50];//filename
	double sigma = 1.0, *rayleigh;
	FILE *fp;
	printf("length=");		scanf("%d", &length);
	printf("sigma=");		scanf("%lf", &sigma);
	sprintf(filename, "Rayleigh_%d_%d.txt", (int)(sigma * 100), length);
	rayleigh = Rayleigh_Distribution(sigma, length);
	fp = fopen(filename,"w");
	for (i = 0; i < length; i++)
	{
		fprintf(fp, "%lf\n", rayleigh[i]);
	}
	fclose(fp);

}
//rayleigh
double *Rayleigh_Distribution(double sigma, int length)
{
	int i = 0;
	double *uniform = Uniform_Distribution(length, length);
	double *rayleigh = (double *)malloc(length * sizeof(double));
	for (i = 0; i < length; i++)
	{
		rayleigh[i] = sqrt(-log(pow(uniform[i], 2))) * sigma;
	}
	return rayleigh;
}
/**********************************************************************************************/
/**********************************************************************************************/
//demo poisson
void Demo_Poisson(void)
{
	int i = 0, length = 0;
	char filename[50];
	double lamda = 0;
	int *poisson;
	FILE *fp;
	printf("length=");	scanf("%d", &length);
	printf("lamda=");	scanf("%lf", &lamda);
	sprintf(filename, "Poisson_%d_%d.txt", (int)(lamda * 100), length);
	poisson = Poisson_Distribution(lamda, length);
	fp = fopen(filename,"w");
	for (i = 0; i < length; i++)
	{
		fprintf(fp, "%d\n", poisson[i]);
	}
	fclose(fp);
}
//poisson
int *Poisson_Distribution(double lamda,unsigned int length)
{
	unsigned int i = 0, k = 0;
	int *poisson = (int *)malloc(length * sizeof(int));
	double ans = 1.0, temp = exp(-lamda);
	srand((unsigned int)NULL);
	for (i = 0; i < length; i++)
	{
		while(ans >= temp)
		{
			k++;
			ans = ans * rand() / 32767.0;
		}
		poisson[i] = k - 1;
		ans = 1.0;
		k = 0;
	}
	return poisson;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-26 00:10:37

随机数的生成:均匀分布、正态、泊松 、瑞利的相关文章

曲线拟合——(2)拉普拉斯/瑞利/对数正态 曲线

作者:桂. 时间:2017-03-15  21:12:18 链接:http://www.cnblogs.com/xingshansi/p/6556517.html 声明:欢迎被转载,不过记得注明出处哦~ 本文为拟合系列中的一部分,主要介绍拉普拉斯曲线 .瑞利曲线.对数正态曲线的拟合,并给出理论推导. 一.理论分析 A-拉普拉斯(Laplace) 对于拉普拉斯分布: $f(x) = \frac{1}{{2b}}{e^{ - \frac{{\left| {x - \mu } \right|}}{b}

在opencv3中实现机器学习之:利用正态贝叶斯分类

opencv3.0版本中,实现正态贝叶斯分类器(Normal Bayes Classifier)分类实例 #include "stdafx.h" #include "opencv2/opencv.hpp" using namespace cv; using namespace cv::ml; int main(int, char**) { int width = 512, height = 512; Mat image = Mat::zeros(height, wi

【程序员眼中的统计学(7)】正态分布的运用:正态之美

正态分布的运用:正态之美 作者 白宁超 2015年10月15日18:30:07 摘要:程序员眼中的统计学系列是作者和团队共同学习笔记的整理.首先提到统计学,很多人认为是经济学或者数学的专利,与计算机并没有交集.诚然在传统学科中,其在以上学科发挥作用很大.然而随着科学技术的发展和机器智能的普及,统计学在机器智能中的作用越来越重要.本系列统计学的学习基于<深入浅出统计学>一书(偏向代码实现,需要读者有一定基础,可以参见后面PPT学习).正如(吴军)先生在<数学之美>一书中阐述的,基于统

Linux真随机数的生成

今天看<白帽子讲WEB安全>一书,看到笔者谈到Linux如何实现真随机数生成,感觉非常有用,记录下来 #include<iostream> using namespace std; #include<unistd.h> #include<fcntl.h> #include<cmath> int main() { int randoms=open("/dev/random",O_RDONLY); int randomn; rea

OpenCV Machine Learning 之正态贝叶斯分类器源代码分析(Normal Bayes Classifier)

1.  CvNormalBayesClassifier的 类 定 义 在ml.hpp中有以下类定义: [cpp] view plaincopyprint? class CV_EXPORTS_W CvNormalBayesClassifier : public CvStatModel { public: CV_WRAP CvNormalBayesClassifier(); virtual ~CvNormalBayesClassifier(); CvNormalBayesClassifier( co

java 随机数的生成

生成10个不小于100000的6位数 public static void main(String[] args) { Random random = new Random(); for (int i=0;i<10;i++) { System.out.println("第=="+i+"个邀请码"+(random.nextInt(899999)+100000)); } } 结果: 第==0个邀请码536686 第==1个邀请码161397 第==2个邀请码685

JavaScript算法题之–随机数的生成

JavaScript算法题之–随机数的生成 需求描述:从一组有序的数据中生成一组随机并且不重复的数,类似于简单的抽奖程序的实现. 先来生成一个有序的数组: 1 var arr = [], 2     length = 100, 3     i = 0; 4   5 for( ; i < length; i++ ){ 6     arr.push( i ); 7 } 从一个长度为 100 的有序数组中随机拿出 10 个随机的数,并且不能有重复. 方法1:随机抽取法 01 var gRandomAr

坚持一下,正态的哲学就在一个百分点——技术需要不断积累

现状 IT日新月异,完全让人慌张和措手不及,不久前刚出来MVC,很快就连升几个版本:其他的,Swift,智能穿戴,大数据等等,让我这样笨拙的人情何以堪啊!!! 是的,我爱技术,但同时我又比较笨和比较浮躁.(不对称关系组合在一起,真揪心) 说比较笨,是因为我CPU处理速度不是那么地快,随着年龄的增长,确实力不从心: 说比较浮躁,是因为我什么都想学,什么都想要,虽然我没有说直接要钱,但是我想要通过牛逼的技术,来赚更多的钱. 实际上,当我重新选择来写博文这条路,我有个比较小型而且明确的目标,人生重新有

OpenCV Machine Learning 之 正态贝叶斯分类器 (Normal Bayes Classifier)

OpenCV Machine Learning 之 正态贝叶斯分类器 (Normal Bayes Classifier)

z检验用于检验正态样本均值是否等于某个假设值

    z检验用于检验正态样本均值是否等于某个假设值,不过需要事先知道总体方差,得到的统计量服从正态分布,有的教材上又叫u检验       t检验与z检验相似,t检验不需要知道总体方差,它用样本方差替代总体方差,得到的统计量服从t分布.实践应用中,t检验比z检验常用,因为不容易知道总体的方差.t检验来源于戈斯特的笔名student.     f检验主要用于方差分析,方差分析中,组间均方比上组内均方服从F分布,它是为了纪念费雪(此人对统计学贡献巨大)     卡方检验主要为了检验某个样本是否服从某