필자는 실행 당 의사 난수 생성기를 두 번 이상 시드하지 않았지만 철저한 설명은 절대로하지 않는 것이 좋습니다.의사 난수 생성기를 두 번 이상 시드하는 데 문제가 있습니까?
int get_rand() {
srand(time(NULL));
return rand();
}
초 당 get_rand
여러 번 호출하기 때문에 결과를 반복 생성합니다 물론, 다음 (C/C++) 예를 들어 좋은 생각이 아닌 이유를 쉽게 알 수있다.
그러나 다음 예는 여전히 받아 들일만한 해결책이 아닙니까?
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
: 생성자가 빠르게 연속적으로 여러 번 호출 되더라도 srand
을 호출 할 때마다 다른 매개 변수가 있습니다. 분명히 이것은 스레드로부터 안전하지는 않지만 다시는 rand
이 아닙니다.
이 연습의 목적은 'MyRand'의 클라이언트에서 srand를 호출하는 "부담"을 덜어주는 것입니다. 여기서 MyRand는 다이를 모델링하는 것일 수 있습니다. 그러나 반면에, 우리가 같은 방법으로 재산 바퀴, 동전 던지기 등을 구축한다면, 우리는 많은 씨앗을 얻을 것이다. – a038c56f