【发布时间】:2014-02-07 10:24:17
【问题描述】:
在代码中的某处(深、深)说我正在使用随机数来做一些很酷的事情。测试通常应该是确定性的,而这部分代码的发布版本的行为明确利用了随机数生成器的非确定性/随机性。
所以为了获得确定性(功能)测试,我想设置一个固定的种子值:
size_t seed = 42;
std::mt19937 rng;
rng.seed(seed);
但我也想确保当我使用随机输入和随机种子时不会发生任何奇怪的事情(即异常):
std::mt19937 rng;
rng.seed(std::random_device()());
显然,有限数量的测试运行无法确定代码是否正确;但是,大量的试运行至少可以给你一些信心。
如何最好地处理这个问题?我想添加类似的东西:
size_t seed = std::random_device()();
#ifdef TESTING
seed = 42;
#endif
rng.seed(seed);
但是,我不能有一个测试文件(使用 gtest)对某些测试使用随机种子,而对其他一些测试使用恒定种子(可以吗?)。
¹在我的例子中:我从 n 中均匀且独立地随机选择一个元素来对输入进行分区。
编辑:我问的是功能测试,而不是单元测试。
【问题讨论】:
-
给定一个特定的种子,你的生成器可能是完全确定的