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

标签 c++ linux c++11 random

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

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

相关文章:

c++ - 使用字符串流解码十六进制编码的字符串

c++ - 用Visual Studio 11编译出来的可执行文件有什么特别之处导致无法在Windows XP上执行?

c++ - 如何处理 std::find_if() 返回 false?

linux - 适用于 Linux 的 Visual Studio 2017 cpprestsdk

C++11 Mersenne Twister 每次都产生相同的值

c++ - 虚函数可以被非虚函数覆盖吗?

C++:如何用两个括号创建一个对象(类)。对于前点 obj1((2,2),(3,8))

c++ - OpenMP、C++ 和迭代器

linux - 实时 Linux 系统监控工具

c++ - 在appimage中添加资源