我正在创建一个程序,我需要在不同的时间输出不同的东西。它是随机的,但总是输出相同的东西,是的,我放入了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();
}
}
答案 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
返回的值因每次迭代的精度低而保持相同的情况,因此随机生成重新启动同一地点。所以你应该在开始循环之前只调用一次。