0%

现代编程语言,大都在标准库中包含了随机库。例如,C++ 在 C++11 标准中添加了 random 头文件,提供了现代的随机库;Python 则有 random。C++11 的随机库将生成随机数的过程在逻辑上切分成了两个步骤:随机数生成引擎和分布。在学习 C++11 的 random 库时,std::mt19937 这一随机数生成引擎的名字看起来十分奇怪,成功吸引了我的注意力。

查询后得知,std::mt19937 中的 MT 是 Mersenne Twister 的缩写,这是伪随机数生成算法的名字(梅森旋转算法);而 19937 则取自算法中用到的梅森素数 $2^{19937} - 1$。这里,梅森素数是算法生成伪随机数的循环长度(period),而旋转则说的是算法内部对定长二进制串循环位移的过程。

此篇讲解梅森旋转算法的一些原理,并介绍对其的一个「爆破」方法。

阅读全文 »

这是这一系列文章,也是计划中的最后一篇。此篇介绍复杂一些的话题:如何在浮动体中摆放多个元素,以及如何处理它们的题注(caption)。

思想一旦被禁锢,心灵就会孱弱。

阅读全文 »

众所周知,C++ 语言本身并不提供 I/O 功能。C++ 的 I/O 是通过标准库中输入输出流来实现的。标准库在 iostream 头文件当中,预定义了六个流对象,他们是:

  • istream <- std::cin/std::wcin,对应标准输入的输入流;
  • ostream <- std::cout/std::wcout,对应标准输出的输出流;
  • ostream <- std::cerr/std::wcerr,对应标准错误的输出流。

稍有经验的 C++ 程序员都应对这些流熟悉(至少对非宽字符版本的三个流对象熟悉),因此此篇不介绍它们的基本用法,而是讨论流的缓冲区。

阅读全文 »

作为一个偏科严重的理工男,高中时期,我可以在数学和理综考试中拿到满分或者接近满分的成绩,但我也可以在语文和英语两门科目当中考出刚及格甚至不及格的成绩。因此,迷上写博客文章,以及出版一本 GRE 的练习册对我而言也算是很神奇的事情了。

阅读全文 »