两个主要函数两个简单应用
如果设定种子值,matlab:rng(),c++:srand(unsignd),则最终得到的随机数,无论是一个还是一个vector,都是固定的,可见有一种内部的机制(mechanism)保证了随机数的生成,该机制以rng或者srand的参数为参数,可见随机数并不真正“随机”,是为伪随机数。
两个主要函数
属于<cstdlib>标准库,该库又被包含在<iostream>中。
- int rand()
从srand(seed)中指定的seed开始,返回一个[seed, RAND_MAX(0x7fff))之间的随机整数(有某些均匀分布uniformed distribution的味道),注意是整数。整数相除如果不事先进行类型转换的话,得到的值仍为整数。所以如果想产生[0, 1)之间的伪随机数:
double randomVal = rand()/double(RAND_MAX);
void srand(unsigned seed)
seed是rand()的种子,也被用来初始化rand()的起始值(与实验不符,有待考证,如果这样成立的话,可实现随机数区间的一种截断)。如果希望rand()在每次程序运行时产生的数值不同,必须给传srand一个变直,这个变值可以手动确定,也可以当前经历的时间(elapsed time,time_t(0),返回从1970年1月1日00:00:00到目前为止所经历的时间)作为其值(需包含<ctime> 头文件)。
srand(unsigned(time_t(0)));
两个简单应用
获得0~10之间的随机整数(不包括10)
#include <cstdlib>#include <ctime>#include <stdio.h>int main(int, char**){srand(unsigned(time_t(0)));int rnd_vals[10];for (size_t i = 0; i < 10; ++i)rnd_vals[i] = rand() % 10;return 0;}
生成任意区间任意个数的服从均匀分布的数据,例10个五维的[-5, 5]之间的数据
#include <cstdlib>#include <ctime>#include <vector>#include <iostream>#include <iomanip>using namespace std;void print(const vector<vector<double> >& X){for (size_t i = 0; i < X.size(); ++i){for (size_t j = 0; j < X[i].size(); ++j)cout << setw(8) << X[i][j] << " ";cout << endl;}}int main(int, char**){int N = 10, d = 5;srand(unsigned(time_t(0)));vector<vector<double> > X;for (size_t i = 0; i < N; ++i){X.push_back(vector<double>());for (size_t j = 0; j < d; ++j)X.back().push_back(10 * rand() / double(RAND_MAX) - 5);}print(X);return 0;}