`std::random_device`和`std::mt19937_64`有什么区别?

4

我对密码学和与之相关的知识很陌生。我一直在学习提供这些功能的PRNG和CPP库,发现现代CPP中有std::random_devicestd::mt19937_64。但是,它们之间有什么区别?我们应该在何时/何处使用它们(在什么情况下)?


1
请参考 https://dev59.com/_1QJ5IYBdhLWcg3w05RM 和 https://dev59.com/-Zjga4cB1Zd3GeqPROs3 了解可能的重复内容。 - Max Langhof
根据实现方式,std::random_device 可能会产生加密安全的随机数。std::mt19937 永远不会产生加密安全的随机数。您可以为 std::mt19937 提供种子甚至序列化其内部状态。但是您不能对 std::random_device 进行这样的操作。通常情况下,std::mt19937 比 std::random_device 快得多。 - user515430
1个回答

4

std::random_device 是一个产生非确定性随机数的均匀分布整数随机数生成器。它可以与分布一起使用来生成随机数,但是许多实现的std::random_device在熵池耗尽后性能急剧下降,因此建议仅使用它来为伪随机数生成器(例如std::mt19937_64)提供种子。它们“不那么随机”,但不像前者那样退化,所以通常会按照以下方式链接使用:

std::random_device rd;
std::mt19937_64 eng(rd());
std::uniform_int_distribution<int> uniform_dist(1, 6)

std::cout << uniform_dist(eng);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接