我想通过简要概述2015年的技术水平来补充《愤怒的鞋子》和Peterchen的出色回答:
一些不错的选择
randutils
该randutils
库(演示文稿)是一个有趣的新颖性,提供了简单的界面和(已声明的)强大的随机功能。它的缺点是,它增加了对项目的依赖,并且,它是新的,尚未经过广泛的测试。无论如何,免费(MIT许可证)和仅标头,我认为值得尝试。
样品最少:模具辊
#include <iostream>
#include "randutils.hpp"
int main() {
randutils::mt19937_rng rng;
std::cout << rng.uniform(1,6) << "\n";
}
即使对该库不感兴趣,该网站(http://www.pcg-random.org/)也提供了许多有关随机数生成主题的有趣文章,尤其是C ++库。
助推随机
Boost.Random
(文档)是启发C++11
的的库<random>
,与之共享许多接口。尽管从理论上讲也是一个外部依赖项,Boost
但现在它的状态为“准标准”库,并且其Random
模块可以视为生成高质量随机数的经典选择。就C++11
解决方案而言,它具有两个优点:
- 它更可移植,只需要对C ++ 03的编译器支持
- 它
random_device
使用系统特定的方法来提供高质量的播种
唯一的小缺陷是提供的模块random_device
不只是标头,还必须编译和链接boost_random
。
样品最少:模具辊
#include <iostream>
#include <boost/random.hpp>
#include <boost/nondet_random.hpp>
int main() {
boost::random::random_device rand_dev;
boost::random::mt19937 generator(rand_dev());
boost::random::uniform_int_distribution<> distr(1, 6);
std::cout << distr(generator) << '\n';
}
尽管最小的样本可以很好地工作,但是实际程序应该使用以下改进:
- 做
mt19937
一个thread_local
:生成器很丰满(> 2 KB)并且最好不要分配在堆栈上
mt19937
多于一个整数的种子:梅森扭转者(Mersenne Twister)具有很大的状态,并且可以在初始化期间利用更多的熵
一些不太好的选择
C ++ 11库
尽管是最惯用的解决方案,但该<random>
库甚至不能满足其基本需求,也无法提供很多接口。缺陷在于std::random_device
:标准不要求其输出(只要有entropy()
return 0
)就必须具有任何最低质量,并且自2015年起,MinGW(不是最常用的编译器,但几乎没有选择)会始终4
在最小样本上打印。
样品最少:模具辊
#include <iostream>
#include <random>
int main() {
std::random_device rand_dev;
std::mt19937 generator(rand_dev());
std::uniform_int_distribution<int> distr(1, 6);
std::cout << distr(generator) << '\n';
}
如果实施不烂,则此解决方案应等同于Boost 1,并且适用相同的建议。
戈多的解决方案
样品最少:模具辊
#include <iostream>
#include <random>
int main() {
std::cout << std::randint(1,6);
}
这是一个简单,有效和简洁的解决方案。唯一的缺陷是,如果及时发布C ++ 17并且实验randint
功能已被批准为新标准,则大约需要两年的时间进行编译。也许到那时,播种质量的保证也会提高。
样品最少:模具辊
#include <cstdlib>
#include <ctime>
#include <iostream>
int main() {
std::srand(std::time(nullptr));
std::cout << (std::rand() % 6 + 1);
}
旧的C解决方案被认为是有害的,并且有充分的理由(请参阅此处的其他答案或此详细分析))。尽管如此,它仍然具有优点:简单,可移植,快速且诚实,从某种意义上说,人们知道一个随机数很难过,因此人们不打算将它们用于严肃的目的。
会计巨魔解决方案
样品最少:模具辊
#include <iostream>
int main() {
std::cout << 9; // http://dilbert.com/strip/2001-10-25
}
尽管对于常规压模辊来说9的输出有些不寻常,但人们必须佩服此解决方案中优良品质的完美结合,该解决方案是最快,最简单,最易于缓存和最便携的解决方案。用9替换为4可以得到一个完美的生成器,适用于任何类型的龙与地下城死亡,同时仍然避免了带有符号的值1、2和3。唯一的小缺点是,由于迪尔伯特的会计巨魔脾气暴躁,该程序实际上引起未定义的行为。