我有一个函数可以从一组字母表中生成随机字符。这个函数会被调用多次,因此我试图让它使用相同的变量集,即具有相同的种子,这样字符串就不会尽可能地重复。
#include <iostream>
#include <random>
#include <string>
std::string generateRandomChar(const unsigned int _len)
{
std::string result;
result.reserve(_len);
static constexpr char alphanum[] = "0123456789"
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, 61);
for (int i = 0; i < _len;
result += (alphanum[dis(gen)]);
}
return result;
}
int main(){
for(int i = 0; i < 10; ++i){
std::cout << generateRandomChar(10) << std::endl;
}
}
不幸的是,我对 c++11 函数没有任何专业知识,而且我之前只使用 srand
和 friend ,所以我在这里可能会犯很多错误。目前它可以工作并生成大量字符串而无需重复,但我确定我可以制作其中任何一个 -
-
std::random_device rd;
-
std::mt19937 gen(rd());
-
std::uniform_int_distribution<> dis(0, 61);
也是静态变量,所以每次调用函数时都不会计算它,因为那样会浪费,对吧?
那么这里哪个应该是静态的呢?您在此处看到任何错误/改进吗?
谢谢你:D
编辑 - 这是一个 ideone 链接 - http://ideone.com/e7ssXo
最佳答案
So which one should be static here?
std::mt19937 gen
或都不是。
std::random_device
使用非确定性熵源(如果可用)生成均匀分布的随机整数。您的代码使用 std::random_device
输出作为 std::mt19937
伪随机生成器的种子。因此,如果您在 PC 上运行,您很可能为 std::mt19937
提供良好的非确定性种子,因此无需将它们中的任何一个设为静态。我假设 std::random_device
仅在低端 Controller 上作为纯程序 PRNG 实现。
另一方面,一次性播种更为惯用,因此您可以将 std::mt19937
声明为静态。 std::mt19937
本身实现了具有 19937 位状态的高质量 PRNG 算法,因此如果生成器运行在现代个人电脑。
无需将 std::uniform_int_distribution
设为静态,因为它只是一个根据所需分布属性修改实际生成器输出的包装器。因此,由您决定是否将其设为静态。
关于c++ - 使用静态防止函数内的多个拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39607717/