我見過很多關於每次執行不超過一次僞隨機數生成器的建議,但從來沒有伴隨徹底的解釋。當然,很容易看出爲什麼以下(C/C++)的例子是不是一個好主意:多次播種僞隨機數生成器的問題?
int get_rand() {
srand(time(NULL));
return rand();
}
因爲每秒調用get_rand
多次重複產生的結果。
但是下面的例子仍然不是一個可以接受的解決方案嗎?
MyRand.h
#ifndef MY_RAND_H
#define MY_RAND_H
class MyRand
{
public:
MyRand();
int get_rand() const;
private:
static unsigned int seed_base;
};
#endif
MyRand.cpp
#include <ctime>
#include <cstdlib>
#include "MyRand.h"
unsigned int MyRand::seed_base = static_cast<unsigned int>(time(NULL));
MyRand::MyRand()
{
srand(seed_base++);
}
int MyRand::get_rand() const
{
return rand();
}
的main.cpp
#include <iostream>
#include "MyRand.h"
int main(int argc, char *argv[])
{
for (int i = 0; i < 100; i++)
{
MyRand r;
std::cout << r.get_rand() << " ";
}
}
即即使MyRand
:s的構造函數被連續多次調用,每次調用srand
都有不同的參數。很明顯,這不是線程安全的,但是再也不是rand
。
我想補充一點這個練習的整個目的是緩解由`MyRand`,其中`MyRand`可能被造型模具的客戶端調用函數srand的「包袱」。但另一方面,如果我們也以相同的方式製造幸運輪,拋硬幣等,我們將獲得很多種子。 – a038c56f 2009-06-10 18:42:06