【问题标题】:rand() doesn't work even with srand( time(NULL) )rand() 即使使用 srand( time(NULL) ) 也不起作用
【发布时间】:2014-01-21 00:45:46
【问题描述】:

所以我试图在函数内部生成随机整数,但它返回相同的数字。 NUM_SOURCES == 5 并且对于所有 5 次重复它给出相同的数字,尽管 srand(time(0)) 被调用。我在没有std::的情况下尝试了同样的方法,但结果没有改变。

有什么建议吗?

std::srand(time(0)); //setting seed
    ...
    for (int i = 0; i < NUM_SOURCES; i++)
                         {
                             if (sourceDeq->at(i)->getCurrentBid() == NULL) // If the source is empty, generate a new order
                             {
                                 sourceDeq->at(i)->setCurrentBid(sourceDeq->at(i)->generateBid(systemTime));
                             }
                         }
    ...
    Bid* Source::generateBid(int sysTime)
    {
        bidAmount = bidAmount + 1;
        return new Bid(bidAmount, generateTimeCreation(sysTime), 0, 0, 0, getNumber());
    }
    ...

    int Source::generateTimeCreation(int sysTime)
    {
        srand(0);
        if (sLaw == UNIFORM)
            return (sysTime + std::rand() % 10);
        if (sLaw == EXPONENTIAL)
            return(sysTime + round((1 - exp(-(std::rand() % 100))) * 10));
    }

【问题讨论】:

  • 你能编辑你的代码,让它不会跑出窗口的右侧吗?
  • 你打电话给srand 太频繁了。一次就够了。
  • PRNG 实际上并不是随机的。它们从种子开始并生成具有特定周期的数字序列。您通常提供种子一次,然后生成随机数,因为 PRNG 的状态会自行改变。通过使用相同的数字反复播种(您的代码可能在一毫秒内运行),您将始终获得相同的随机数序列。
  • 您似乎可能在函数范围之外调用 srand(),您能澄清一下吗?

标签: c++ random srand


【解决方案1】:

srand(0);再次初始化随机数生成器,所以每次都会有同样的结果……别这样。

使用time(NULL) 调用的全部意义在于提供一个随机种子。

【讨论】:

  • 天哪,我是多么愚蠢。谢谢,伙计!当您在显示器前花费数小时时,就会发生这种情况。
猜你喜欢
  • 2020-07-13
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多