【问题标题】:Can I temporarily disable random / srand in c++?我可以在 C++ 中暂时禁用 random / srand 吗?
【发布时间】:2021-10-01 05:59:10
【问题描述】:

我有一个非常大的代码库,它使用我需要调试的 srand 和 rand。随机执行使调试变得困难,因为错误也是随机发生的。有什么方法可以临时使库确定性地执行,以便我可以调试代码?

【问题讨论】:

  • 如果您始终将相同的值传递给srand()rand() 是确定性的。
  • 还有rr记录/rr回放等其他选项
  • 我建议您将rand 调用抽象到您自己的函数中。然后用于测试它可以用于返回已知会引入错误的固定值,否则调用rand(或使用the C++ PRNG classes,这通常比srand/rand好得多)。
  • @user202729 这个工具的宣传较少!感谢提及
  • 可以使用依赖注入,不要直接调用rand(),而是使用接口生成随机数。此处示例:onlinegdb.com/I9XuhtHH0

标签: c++ debugging random


【解决方案1】:

如果您可以在包含链中添加文件,则可以将其放入该文件中:

#define rand() (4)

不是很漂亮,但可以提供帮助。

reference

【讨论】:

    【解决方案2】:

    没有禁用srand 的标准方法。在某些实现中,您可以将其重新定义为什么都不做,它会起作用,但这是违反 ORD 的:

    extern "C" void srand(unsigned) noexcept {
        // Nothing
    }
    
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    
    int main() {
        srand((unsigned)time(0));
        printf("%d\n", rand());
    }
    

    在我的测试中它在 GCC 中工作并且每次都打印相同的数字。您可能可以使用它来调试您的代码,但它肯定不适合生产使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      • 2018-11-19
      • 1970-01-01
      • 2018-07-27
      • 2015-09-20
      相关资源
      最近更新 更多