【问题标题】:Random seed at runtime运行时的随机种子
【发布时间】:2011-05-18 21:33:20
【问题描述】:

如何在运行时生成不同的随机数?

我试过了

srand((unsigned) time(0));

但它似乎在每次启动程序时都会给我一个随机数,但不是在每次执行函数本身时...

我正在尝试使用随机数、随机迭代、元素数等自动执行一些测试...我想我可以调用

srand((unsigned) time(0));

在我的测试功能和宾果游戏开始时,但显然不是。

你会建议我做什么?

【问题讨论】:

    标签: c++ random seed


    【解决方案1】:

    srand()

    正如其他人所提到的。 srand() 为随机数生成器提供种子。这基本上意味着它设置了随机数序列的起点。因此,在真正的应用程序中,您希望调用一次(通常是您在 main 中执行的第一件事(在设置区域设置之后))。

    int main()
    {
        srand(time(0));
    
        // STUFF
    }
    

    现在,当您需要一个随机数时,只需调用 rand()。

    单元测试

    转向单元测试。在这种情况下,您真的不想要随机数。非确定性单元测试是浪费时间。如果一个失败,你如何重新生成结果以便你可以修复它?

    您仍然可以在单元测试中使用 rand()。但是您应该初始化它(使用 srand()),以便在调用 rand() 时单元测试总是获得相同的值。因此,测试设置应在每次测试之前调用 srand(0)(或 0 以外的其他常量)。

    您需要在每次测试之前调用它的原因是,当您调用单元测试框架只运行一个测试(或一组测试)时,它们仍然使用相同的随机数。

    【讨论】:

    • York 我正在做的测试并不是真正的单元测试......这只是一个节流测试,作为一般如何处理的信息,以获得概述......
    【解决方案2】:

    每次程序执行都需要调用 srand 一次。调用 rand 会更新随机数生成器的内部状态,因此再次调用 srand 实际上会重置随机状态。如果不到一秒钟,时间将相同,您将获得相同的随机数流。

    【讨论】:

      【解决方案3】:

      srand 用于播种随机数生成器。 “s”代表“种子”。之所以称为“播种”,是因为您只做一次:一旦“播种”,您就有了一个流,您可以根据需要多次调用rand。不要在需要随机数的函数开头调用srand。在程序的开头调用它。

      是的,这是一个 hack。但它是一个 hack,具有非常完善的界面。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-28
        • 2016-08-12
        • 2016-10-07
        • 1970-01-01
        • 2019-08-17
        • 2015-02-01
        相关资源
        最近更新 更多