c的随机数函数rand_r()
推荐用rand_r()来产生随机数。
顺便普及一下很多地球人都知道的常识
大家都知道随机种子(rand seed),所谓的随机其实是:每一个种子会有一串看似随机的序列,每次取下一个出来,整体都近乎是随机分布的。换句话说,每一次改变随机种子变量的值,这个随机数都会重新开始。这样其实能带来一个副产品般的好处,结果可以重现,便于测试。
1. 最简单的例子
见随机代码如下,每一次更改值后,都会重新随机序列。
-
#include
-
#include
-
-
using namespace std;
-
-
int main() {
-
unsigned int seed = 123;
-
cout << rand_r(&seed) << endl;
-
cout << rand_r(&seed) << endl;
-
seed = 456;
-
cout << rand_r(&seed) << endl;
-
cout << rand_r(&seed) << endl;
-
seed = 123;
-
cout << rand_r(&seed) << endl;
-
cout << rand_r(&seed) << endl;
-
seed = 456;
-
cout << rand_r(&seed) << endl;
-
cout << rand_r(&seed) << endl;
-
}
2. 如果做成函数,不能是局部变量
下面代码表示,要注意,rand_r() 只关心变量本身,如果换成一个局部变量,就不行了,比如这样,随机值就不会变了。
-
#include
-
#include
-
-
using namespace std;
-
-
unsigned int seed_ = 123;
-
-
unsigned int GetRand() {
-
unsigned int seed = seed_;
-
return rand_r(&seed);
-
}
-
-
int main() {
-
seed_ = 123;
-
cout << GetRand() << endl;
-
cout << GetRand() << endl;
-
seed_ = 456;
-
cout << GetRand() << endl;
-
cout << GetRand() << endl;
-
seed_ = 123;
-
cout << GetRand() << endl;
-
cout << GetRand() << endl;
-
seed_ = 456;
-
cout << GetRand() << endl;
-
cout << GetRand() << endl;
-
}
3. 类函数
唯一不爽的是,rand_r()不能用于const的类函数,因为如果seed_作为成员变量的话,rand_r()要改变成员变量,真的要实现,除非seed_作为static的全局变量。见代码如下:
但要考虑线程安全问题了(本代码没包含)。
-
using namespace std;
-
-
class R {
-
public:
-
R() { }
-
unsigned int GetRand() const {
-
return rand_r(&seed_);
-
}
-
void set_seed(const unsigned int seed) {
-
seed_ = seed;
-
}
-
private:
-
static unsigned int seed_;
-
};
-
-
unsigned int R::seed_ = 0;
-
-
int main() {
-
R r;
-
r.set_seed(123);
-
cout << r.GetRand() << endl;
-
cout << r.GetRand() << endl;
-
r.set_seed(456);
-
cout << r.GetRand() << endl;
-
cout << r.GetRand() << endl;
-
r.set_seed(123);
-
cout << r.GetRand() << endl;
-
cout << r.GetRand() << endl;
-
r.set_seed(456);
-
cout << r.GetRand() << endl;
-
cout << r.GetRand() << endl;
-
}
转自:
http://blog.csdn.net/made_in_chn/article/details/6604500
阅读(17458) | 评论(0) | 转发(0) |