一般要用到两个头文件
随机整数数
#include<stdlib.h>
#include<time.h>
首先生成一个0-rand_max的随机数:
#include<iostream>
#include<stdlib.h>
int void(){
int i;
i=rand()
cout<<i<<endl;
return 0;
}
输出:
1894357422
注意这里无论运行多少次随机数都一样,这是由于没有设置随机数种子的原因。
设置随机数种
使用srand(usigned int)设置随机数种子,参数是一个无符号整数。
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int main(){
int i,j;
srand((unsigned)time(NULL));
for(i=0;i<=10;i++){
cout<<rand()<<endl;
}
return 0;
}
输出:
487353927
1611550431
784589536
1486413294
1935360489
1822850335
918443810
1851401880
899173349
579650615
487488736
输出指定范围的随机数
x = rand()%11; /产生1~10之间的随机整数/
y = rand()%51 - 25; /产生-25 ~ 25之间的随机整数/
z = ((double)rand()/RAND_MAX)*(b-a) + a;/产生区间[a,b]上的随机数/
通用:
要取得[a,b)的随机整数,使用(rand() % (b-a))+ a;
要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a;
要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1;
要取得0~1之间的浮点数,可以使用rand() / double(RAND_MAX)。
eg:
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int main(){
int i,j;
srand((unsigned)time(NULL));
for(i=0;i<=10;i++){
cout<<rand()%11<<endl;
}
return 0;
}
输出:
4
0
3
9
9
3
3
6
4
10
3
eg:
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int main(){
int i,j;
srand((unsigned)time(NULL));
for(i=0;i<=10;i++){
cout << rand()/(double)(RAND_MAX)<< endl;
}
}
这里的解释就是rand()产生的是0-RAND_MAX之间的数,所以除以RAND_MAX就是0-1之间的数。
正太分布随机数
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<math.h>
using namespace std;
double gaussrand()
{
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 X;
}
int main(){
int i,j;
srand((unsigned)time(NULL));
double sum=0,RND;
for(i=0;i<100000;i++){
RND=gaussrand();
cout << RND<< endl;
sum+=RND;
}
cout<<"平均:"<<sum/100000<<endl;
return 0;
}
这样生成的高斯分布随机数序列的期望为0.0,标准差为1.0。若指定期望为E,标准差为V,则只需增加:
X = X * V + E;(由Marsaglia和Bray在1964年提出)
还有Box–Muller transform将均匀分布转换为正太分布。
有一个称为 Box-Muller (1958) 转换的算法能够将两个在区间(0,1] 的均匀分布转化为标准正态分布。原理是这样
U
1
U_1
U1,
U
2
U_2
U2是两个 相互独立的
(
0
,
1
)
(0, 1)
(0,1)之间的均匀分布的样本。则通过下面两个公式可以转换为 标准的正太分布,均值为0,方差为1:
这里
Z
0
Z_0
Z0和
Z
1
Z_1
Z1是相互独立的标准正太分布