當前位置:首頁 » 編程語言 » 生成高斯分布的隨機數c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

生成高斯分布的隨機數c語言

發布時間: 2023-05-27 17:52:13

㈠ 如何用c語言生成一個正態分布的樣本

調試程序時,隨機數種子可以設常數,例如srand(54321);
用 rand() 產生均勻分布隨機數 x1,x2
利用瑞利分布得正態分布隨機數 y1,y2
再按要求線性縮放一下到[0.01,2] 區間。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
main(){
#define N 100
double rd[N];
double x1,x2,y1,y2;
double pi2=6.28318530728,mx,mi,ave=0;
int i;
//srand(54321);
srand(time(NULL));
for (i=0;i<=N-2;i=i+2){
x1=1.0*rand()/RAND_MAX;
x2=1.0*rand()/RAND_MAX;
y1= sqrt((-2.0*log(x1))) * cos(pi2*x2);
y2= sqrt((-2.0*log(x1))) * sin(pi2*x2);
rd[i]=y1;
rd[i+1]=y2;
}
mx=rd[0];mi=rd[0];
for (i=0;i<N;i++){
if (rd[i]>mx)mx=rd[i];
if (rd[i]<mi)mi=rd[i];
}
//printf("mi=%lf mx=%lf\n",mi,mx);
for (i=0;i<N;i++) rd[i] = (rd[i]-mi)/(mx-mi+0.001) * (2.0-0.01) + 0.01;
for (i=0;i<N-2;i=i+2) printf("%lf %lf\n",rd[i],rd[i+1]);
return 0;
}

㈡ C++math庫里有生成高斯分布隨機數的函數么

VC2008 FeturePack1 以後有,參見http://growupsoft.blog.163.com/blog/static/960729200903104720643/
對源態於可以解析表達成C++的特殊概率分布,根據概率論的原理,產生均勻分布的隨機分布,而後代入分布函數就可以產生高斯分布的隨機數了阿.下面原版轉載:
At the core of any pseudorandom number generation software is a routine for generating uniformly distributed random integers.
In C++ TR1 you have your choice of several core generators that it calls 「engines.」 The following four engine classes are supported in the Visual Studio 2008 feature pack

(微軟已經發布了Visual Studio 2008的Services Pack 1,它包含了此前發布的feature pack,以及完整的TR1支持,後來又發布了一個修正:VC 2008 SP1: Problems with STL/TR1 after installing VS2008 SP1,關於:VC9 SP1 Hotfix For The vector<function<FT>> Crash,關於文檔:微軟TR1文檔).

linear_congruential uses a recurrence of the form x(i) = (A * x(i-1) + C) mod M
mersenne_twister implements the famous Mersenne Twister algorithm
subtract_with_carry uses a recurrence of the form x(i) = (x(i - R) - x(i - S) - cy(i - 1)) mod M in integer arithmetic
subract_with_carry_01 uses a recurrence of the form x(i) = (x(i - R) - x(i - S) - cy(i - 1)) mod 1 in floating point arithmetic
Each engine has a seed() method that accepts an unsigned long argument to specify the random number generation seed. It is also possible to set the seed in more detail using template parameters unique to each engine.

微軟的C++ TR1可以生成以下分布的隨機數:

Generates a Bernoulli distribution.
Generates a binomial distribution.
Generates an exponential distribution.
Generates a gamma distribution.
Generates a geometric distribution.
Generates a normal distribution.
Generates a Poisson distribution.
Generates a uniform integer distribution.
Generates a uniform floating-point distribution.

試驗一:在VS2008中檔或先建一空的VC++項目文件,然後添加新建項cpp文件行裂伍如下:

#include <random>
#include <iostream>

void main(){
std::tr1::mt19937 eng; // a core engine class:Mersenne Twister generator
std::tr1::normal_distribution<double> dist;
std::tr1::uniform_int<int> unif(1, 52);

for (int i = 0; i < 10; ++i) //產生正態分布的10個隨機數
std::cout << dist(eng)<<std::endl;

for(int i = 0; i < 5; ++i) //產生均勻分布的在1到52之間的五個整數隨機數
std::cout << unif(eng) << std::endl;
}

在循環中,每循環一次,就調用mt19937 eng一次,產生一個隨機數輸出。

試驗二:關於種子seed

#include <random>
#include <iostream>
#include <time.h>

void main(){
std::tr1::mt19937 eng; // a core engine class:Mersenne Twister generator
std::tr1::normal_distribution<double> dist;
std::tr1::uniform_int<int> unif(1, 52);
eng.seed((unsigned int)time(NULL)); // reseed base engine 設置種子用#include <time.h>, 不能用#include <time>

for (int i = 0; i < 10; ++i) //產生正態分布的10個隨機數
std::cout << dist(eng)<<std::endl;
//eng.seed(); // reseed base engine
for(int i = 0; i < 5; ++i) //產生均勻分布的在1到52之間的五個整數隨機數
std::cout << unif(eng) << std::endl;
}

試驗三:隨機數寫入文件

#include <random>
#include <iostream>
#include <fstream>
#include <time.h>

using namespace std;
using namespace std::tr1;

void main()
{
mt19937 eng; // a core engine class:Mersenne Twister generator
normal_distribution<double> dist;
uniform_int<int> unif(1, 52);
eng.seed((unsigned int)time(NULL)); // 設置種子用#include <time.h>, 不能用#include <time>

for (int i = 0; i < 10; ++i) //產生正態分布的10個隨機數
cout << dist(eng)<<endl;

ofstream fileout("fileout.dat");
for(int i = 0; i < 5; ++i) //產生均勻分布的在1到52之間的五個整數隨機數
fileout << unif(eng)<< endl;

fileout.close();
}

試驗四:第三方"Mersenne Twister"隨機數生成程序使用試驗(程序來源:Agner Fog http://www.agner.org/random/)

// 使用說明:從網站下載壓縮包,http://www.agner.org/random/randomc.zip
// 展開後,將其中的randomc.h頭文件及mersenne.cpp文件Copy到項目文件夾,
// 並將它們加入到項目中,其中包括"Mersenne Twister"的實現

#include <iostream>
#include <time.h>
#include "randomc.h" // define classes for random number generators

using namespace std;

void main()
{

int seed = (int)time(0); // random seed

// choose one of the random number generators:
CRandomMersenne RanGen(seed); // make instance of random number generator
cout<<"\n\nRandom integers in interval from 0 to 99:\n";
for (int i = 0; i < 40; i++) {
int ir = RanGen.IRandom(0,99);
cout<<ir<<" ";
}

cout <<endl;

cout<<"\n\n\n\nRandom floating point numbers in interval from 0 to 1:\n";
for (int i = 0; i < 40; i++) {
float fr = RanGen.Random();
cout<<fr<<" ";
}

cout <<endl;
}

試驗五:第三方"Mother-Of-All"隨機數生成程序使用試驗(程序來源:Agner Fog http://www.agner.org/random/)

// 使用說明:從網站下載壓縮包,http://www.agner.org/random/randomc.zip
// 展開後,將其中的randomc.h頭文件及mother.cpp文件Copy到項目文件夾,
// 並將它們加入到項目中,其中包括"Mother-Of-All" generator invented by George Marsaglia 的實現

#include <iostream>
#include <time.h>
#include "randomc.h" // define classes for random number generators

using namespace std;

void main()
{

int seed = (int)time(0); // random seed

// choose one of the random number generators:
CRandomMother RanGen(seed); // make instance of random number generator
cout<<"\n\nRandom integers in interval from 0 to 99:\n";
for (int i = 0; i < 40; i++) {
int ir = RanGen.IRandom(0,99);
cout<<ir<<" ";
}

cout <<endl;

cout<<"\n\n\n\nRandom floating point numbers in interval from 0 to 1:\n";
for (int i = 0; i < 40; i++) {
float fr = RanGen.Random();
cout<<fr<<" ";
}

cout <<endl;
}

試驗六:第三方"SFMT"隨機數生成程序使用試驗(程序來源:Agner Fog http://www.agner.org/random/)

重要提示:在編譯前,可以修改頭文件sfmt.h中的#define MEXP以及下面相應的宏代碼:Choose one of the possible Mersenne exponents. Higher values give longer cycle length and use more memory。SFMT利用了SSE2指令,速度最快,但只適合intel系列的部分晶元。

// 使用說明:從網站下載壓縮包,http://www.agner.org/random/randomc.zip
// 展開後,將其中的頭文件及sfmt.cpp文件Copy到項目文件夾,
// 並將它們加入到項目中,其中包括"SFMT" 的實現

#include <iostream>
#include <time.h>
#include "sfmt.h" // define classes for random number generators

using namespace std;

void main()
{

int seed = (int)time(0); // random seed

// choose one of the random number generators:
CRandomSFMT1 RanGen(seed); //注意可以是CRandomSFMT,是CRandomSFMT0,或CRandomSFMT1
cout<<"\n\nRandom integers in interval from 0 to 99:\n";
for (int i = 0; i < 40; i++) {
int ir = RanGen.IRandomX(0,99);
cout<<ir<<" ";
}

cout <<endl;

cout<<"\n\n\n\nRandom floating point numbers in interval from 0 to 1:\n";
for (int i = 0; i < 40; i++) {
float fr = RanGen.Random();
cout<<fr<<" ";
}

cout <<endl;
}

㈢ 高手進,c語言中如何得到服從正態分布的隨機數

最好尋求專門演算法
如果不行的話,也可以用大量隨機數來模擬,譬如生成1000次0或1,然後求其平均數,可以得到很接近正態分布的.
如果有連續的隨機函數,也可以直接求正態分部的積分函數,根據積分函數的反函數來確定位置

㈣ c語言正態分布隨機數生成

int n,i,j,k,l,w,g;改為double n,i,j,k,l,w,g;

㈤ 如何用C語言生成[0.01,2]之間符合正態分布的隨機數。。。注意是正態分布!!答案採用後再追加50分

# include <stdio.h>
# include <math.h>
# include <stdlib.h>
# include <time.h>
# define MAX_N 3000 /*這個值為N可以定義的最大長度*/
# define N 100 /*產生隨機序列的點數,注意不要大於MAX_N*/
# define PI 3.141592653
void randn(double *x,int num)
{
double x1[MAX_N],x2[MAX_N];
int i;
srand((unsigned)time(NULL));
for(i=0;i<N;i++)
{
x1[i]=rand();
x2[i]=rand();
x1[i]=x1[i]/(RAND_MAX+1);
x2[i]=x2[i]/(RAND_MAX+1);
x[i]=sqrt(-2*log(x1[i]))*cos(x2[i]*2*PI);
}
}
void main()
{
double x[N],x_min,x_max;
int i;
FILE *fp;
if((fp=fopen("test.txt","w+"))==NULL)
{
fprintf(stderr,"Can't open the file ");
exit(1);
}
randn(x,N);
x_min=x[0];
x_max=x[0];
for(i=0;i<N;i++)
{
if(x[i]>x_max)
{
x_max=x[i];
}
if(x[i]<x_min)
{
x_min=x[i];
}
}
for(i=0;i<N;i++)
{
x[i]=(x[i]-x_min)/(x_max-x_min)*(2-0.01)+0.01;
}
for(i=0;i<N;i++)
{
printf("%f ",x[i]);
fprintf(fp,"%lf ",x[i]);
if(i%5==4)
{
printf(" ");
}
}
if(fclose(fp)==EOF)
{
printf("Closing error ");
}
}

把生成的數據放入txt文件中,再導入matlab中,查看是否符合正態分布。

得到H1=0,說明確實是正態分布。。。。

㈥ 如何在C語言中生成正態分布的隨機數,要源代碼~謝謝

隨機生成一百個1至100的隨機數。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 100
int main(int argc, char *argv[])
{
int i;
int a[N];
srand(time(NULL));
for(i=0;i<N;i++)
a[i]=rand()%100+1;
printf("生成的隨機數為:\n");
for(i=0;i<N;i++)
{
printf("%5d",a[i]);
if((i+1)%10==0)
printf("\n");
}
system("PAUSE");
return 0;
}
輸出結果如下:
生成的隨機數為:
41 15 82 1 23 51 16 96 92 17
86 71 87 69 74 5 50 18 42 52
46 34 52 18 40 74 79 35 22 36
65 94 80 91 18 72 61 79 4 11
61 30 95 55 11 19 38 87 78 52
95 30 99 53 99 99 10 79 70 33
91 85 10 99 47 58 93 41 19 71
56 60 10 24 73 87 18 38 13 73
57 22 91 4 37 60 67 58 85 48
46 7 57 100 73 96 60 44 24 23
請按任意鍵繼續. . .

㈦ 求一個VC++程序,可以產生滿足高斯分布的隨機數!

float CMycomDlg::Gaussrand(float miu, float sigma)
{
static double V1, V2, S;
static int phase = 0;
double X;

if ( phase == 0 )
{
do {
double U1 = (double)rand() / RAND_MAX;
double U2 = (double)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 (float)(miu+sigma*X);
}