Tôi đã nhìn thấy một vài khuyến nghị không cho việc tạo các trình tạo số giả ngẫu nhiên nhiều lần một lần, nhưng không bao giờ được giải thích kỹ lưỡng. Tất nhiên, nó rất dễ dàng để xem lý do tại sao sau (C/C++) ví dụ không phải là một ý tưởng tốt:Các vấn đề với việc tạo một trình tạo số giả ngẫu nhiên nhiều lần?
int get_rand() {
srand(time(NULL));
return rand();
}
kể từ khi gọi get_rand
vài lần mỗi giây tạo ra kết quả lặp lại.
Nhưng không phải ví dụ sau đây vẫn là giải pháp có thể chấp nhận đượ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() << " ";
}
}
tức là mặc dù MyRand
: hàm tạo của s được gọi nhiều lần liên tiếp nhanh, mỗi cuộc gọi đến srand
có thông số khác. Rõ ràng, đây không phải là chủ đề an toàn, nhưng sau đó lại không phải là rand
.
Tôi có thể thêm rằng toàn bộ mục đích của bài tập này là để giảm "gánh nặng" khi gọi srand từ khách hàng của 'MyRand', trong đó' MyRand' có thể là người mẫu. Nhưng mặt khác, nếu chúng ta cũng chế tạo bánh xe tài sản, đồng xu ném vv trong cùng một cách, chúng ta sẽ nhận được rất nhiều hạt giống. – a038c56f