不要每次都初始化一个新的输出

时间:2017-08-18 10:31:09

标签: c++

我正在创建一个程序,我需要在不同的时间输出不同的东西。它是随机的,但总是输出相同的东西,是的,我放入了srand。

void setcolor()
{
    srand(time(NULL));
    int col = rand() % 4 + 1;
    if (col == 1)
    { cout << "white "; }
    else if (col == 2)
    { cout << "brown "; }
    else if (col == 3)
    { cout << "black "; }
    else if (col == 4)
    { cout << "spotted "; }
}

int main() 
{
    for (int i = 0; i <= 5; ++i)
    {
         setcolor();
    }
} 

2 个答案:

答案 0 :(得分:1)

srand必须被调用一次而不是每次循环。

void setcolor()
{
    int col = rand() % 4 + 1;
    if (col == 1)
    { cout << "white "; }
    else if (col == 2)
    { cout << "brown "; }
    else if (col == 3)
    { cout << "black "; }
    else if (col == 4)
    { cout << "spotted "; }
}

int main() 
{
    srand(time(NULL));
    for (int i = 0; i <= 5; ++i)
    {
         setcolor();
    }
}

它以这种方式工作,因为srand初始化一个&#34;全局变量&#34;由rand()函数使用。

time(null)返回类似于从1970年1月1日起经过的秒数。因此,由于&#34;全局变量&#34;的初始化,您使用相同值的5倍。

但是,在C ++中,使用随机值不是正确的方法。 请更喜欢使用随机标头(4):

#include <iostream>
#include <string>
#include <map>
#include <random>

int main()
{
    std::random_device rd;
    std::map<int, int> hist;
    std::uniform_int_distribution<int> dist(0, 9);
    for (int n = 0; n < 20000; ++n) {
        ++hist[dist(rd)]; // note: demo only: the performance of many 
                          // implementations of random_device degrades sharply
                          // once the entropy pool is exhausted. For practical use
                          // random_device is generally only used to seed 
                          // a PRNG such as mt19937
    }
    for (auto p : hist) {
        std::cout << p.first << " : " << std::string(p.second/100, '*') << '\n';
    }
}

答案 1 :(得分:0)

使用time在您的案例srand(time(NULL));中播种可能会导致time返回的值因每次迭代的精度低而保持相同的情况,因此随机生成重新启动同一地点。所以你应该在开始循环之前只调用一次。