gpt4 book ai didi

c++ - 使用静态防止函数内的多个拷贝

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:34:30 25 4
gpt4 key购买 nike

我有一个函数可以从一组字母表中生成随机字符。这个函数会被调用多次,因此我试图让它使用相同的变量集,即具有相同的种子,这样字符串就不会尽可能地重复。

#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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com