随机数是在同一时间(即同一时间)生成的,因此种子应该是相同的,但是即使条件相同,生成的随机数为何也会不同。
# include < cstdlib >
# include < iostream >
#include < ctime >
using namespace std;
int main()
{
double a,b;
srand(time(0));
a = rand()% (1000 + 1 - 200) + 200;
cout << "Seed = " << time(0) << endl;
cout<<a<<endl;
b = rand()% (1000 + 1 - 200) + 200;
cout << "Seed = " << time(0) << endl;
cout<<b<<endl;
return 0;
}
预期 第一个数字= 529 第二个数字= 529
实际结果 第一个数字= 529 第二个数字= 819
答案 0 :(得分:2)
PRNG通过保持状态来产生数字序列。结合PRNG使用的算法,可以完全确定调用将产生的数量。因此,在调用PRNG时状态也必须更改,否则它将在每次调用时产生完全相同的数字。
您一次种子,然后致电PRNG。这将修改其内部状态并返回一个数字。下一个呼叫不会在相同状态下进行操作,因此可能会产生不同的号码。在您的示例中确实如此
播种是确定PRNG起始状态的方式。如果您要在第二次致电10 = TEXT
10 {
wrap = |
data.field = tx_mask_cnt_news_item_date // field in tt_content, is '2018-08-31'
strftime = %e %B %Y
}
之前向srand(time(0))
添加另一个呼叫,则很有可能返回先前的号码,因为您正确地指出rand
可能没有机会更新。这就是为什么通常的建议是每个程序只能以这种方式播种一次。
答案 1 :(得分:1)
伪随机数发生器确实会生成一系列伪随机数。在某些时候,该序列会重复(经过很长一段时间才能获得良好的打印效果)。使用种子,您只需选择在哪里开始序列。因此,对于相同的种子,您将始终获得相同的序列,但通常不会获得所有相同数字的序列。呼叫rand
总是会得到序列中的下一个号码。
答案 2 :(得分:0)
您的种子始终是不同的,因为您用srand
调用了time(0)
。即使您通过0
,它仍然会返回时间,对于不同的通话,时间总是不同的。
您可以从time
的文档中看到它
time_t time (time_t* timer);
获取当前时间获取当前日历 时间作为
time_t
类型的值。该函数返回此值,如果参数不为null 指针,它也会将此值设置为计时器指向的对象。
如果您希望种子相同,只需将其设为常数即可。
答案 3 :(得分:0)
您要在此处播种RNG:
srand(time(0));
然后您会从这里得到一个随机数字:
a = rand()% (1000 + 1 - 200) + 200;
这里还有另一个随机数:
b = rand()% (1000 + 1 - 200) + 200;
没有其他因素影响您获得的结果。打印time(0)
不会改变结果。不过,您可以在srand(time(0));
之前放置另一个b = rand()%
,然后很可能会得到两次相同的结果(假设两种情况下的时间仍然相同,但是您会看到您可以打印时间)。
答案 4 :(得分:0)
即使种子是种子,为什么生成的随机数也不同 一样。
您的陈述不正确...您的代码提供给种子的种子每秒都不同。
在C ++中,整数文字0(当用作带有指针参数的函数的实际参数时)与nullptr相同。对于将代码可移植到nullptr不是0x0的那些(非常规)计算机,这是C ++的要求。
声明
std::time_t time( std::time_t* arg );
显示arg是指向结构的指针。
在调用
std::time_t time(0);
C ++语言会将0更改为适合您的硬件的nullptr值。
因此,time(nullptr)每秒返回一个不同的结果。 (但是在给定的墙上时钟中多次调用一次以上时,结果相同。)
因此
srand(time(0));
每个壁钟秒将产生不同的序列起始值。