Uniform distribution: Linear with congruential
Normal Distribution: Sum-of-12 method
Other distributions: Inverse transformation method
/***************************************** Copyright (c) Jingshuang Hu @filename:d emo.c @datetime: 2015.10.18 @a UTHOR:HJS @e-mail:[email protected] @blog: Http://blog.csdn.net/hujingshuang ******************************** /#include <stdio.h> #include <stdlib.h> #include <math.h>/****************************** /void menu (void);d ouble *uniform_distribution ( unsigned int length, unsigned int num), void Demo_gaussian (void);d ouble *gaussian_distribution (double miu, double sigma, I NT length), void Demo_rayleigh (void);d ouble *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");p rintf ("1.gaussian distribution\ N2.rayleigh Distribution\n3.poisson distribution\n4.exit\n ");p rintf ("---------------------------------\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");}} /**********************************************************************************************///uniformdouble *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, up)-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 Gaussianvoid 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),//lengthprintf ("miu="), scanf ("%lf", &miu);//miuprintf (" Sigma= "); scanf ("%lf ", &sigma);//sigmasprintf (filename," Gaussian_%d_%d_%d.txt ", (int) (MIU *), (int) (SIGMA * ), 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 methoddouble *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 < 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 = Ga Ussian_distribution_standard (length);d ouble *gaussian = (double *) malloc (length * sizeof (double)); for (i = 0; i < lengt H i++) {Gaussian[i] = gaussian_standard[i] * sqrt (sigma) + Miu;} return Gaussian;} /**********************************************************************************************//************** /void Demo_rayleigh (void) {int i = 0, length = 0;char filename[50];//filenamedouble Sigma = 1.0, *rayleigh; FILE *fp;printf ("length="); scanf ("%d", &length);p rintf ("sigma="); scanf ("%lf", &sigma); sprintF (filename, "Rayleigh_%d_%d.txt", (int) (sigma * +), length); Rayleigh = Rayleigh_distribution (sigma, length); fp = fopen (FileName, "w"); for (i = 0; i < length; i++) {fprintf (FP, "%lf\n", Rayleigh[i]);} Fclose (FP);} Rayleighdouble *rayleigh_distribution (double sigma, int length) {int i = 0;double *uniform = uniform_distribution ( Length, length);d ouble *rayleigh = (double *) malloc (length * sizeof (double)); for (i = 0; i < length; i++) {Rayleigh[i] = sqrt (-log (POW (uniform[i], 2)) * SIGMA;} return Rayleigh;} /**********************************************************************************************//************** Demo Poissonvoid Demo_poisson (void) {int i = 0, length = 0;char filename[50];d ouble lamda = 0;int *poisson; FILE *fp;printf ("length="), scanf ("%d", &length);p rintf ("lamda="), scanf ("%lf", &lamda); sprintf (filename, " Poisson_%d_%d.txt ", (int) (LAMDA *), length);p Oisson = Poisson_distributioN (lamda, length); fp = fopen (filename, "w"); for (i = 0; i < length; i++) {fprintf (FP, "%d\n", Poisson[i]);} Fclose (FP);} Poissonint *poisson_distribution (double lamda,unsigned int length) {unsigned int i = 0, k = 0;int *poisson = (int *) Mallo C (length * sizeof (int));d ouble ans = 1.0, TEMP = exp (-LAMDA); Srand ((unsigned int) NULL); for (i = 0; i < length; i++) {WHI Le (ans >= temp) {K++;ans = ans * rand ()/32767.0;} Poisson[i] = K-1;ans = 1.0;k = 0;} return poisson;}
Copyright NOTICE: This article for Bo Master original article, without Bo Master permission not reproduced.
Generation of random numbers: uniform distribution, Normal, Poisson, Rayleigh