为什么即使种子相同,生成的随机数也不同?

时间:2019-03-26 10:45:17

标签: c++

随机数是在同一时间(即同一时间)生成的,因此种子应该是相同的,但是即使条件相同,生成的随机数为何也会不同。

# 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

5 个答案:

答案 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));

每个壁钟秒将产生不同的序列起始值。