【问题标题】:C++ random number generator called multiple times [duplicate]多次调用C ++随机数生成器[重复]
【发布时间】:2015-03-25 03:53:37
【问题描述】:

您好,我的随机数生成器在每次运行时都会给我相同的数字序列(尽管序列不同),但我遇到了问题。这是一个简化的代码来演示我的问题。

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int random(){
    srand(time(0));
    return(1+rand() % 6);
}
int main(){
    cout<< random() <<endl;
    cout<< random() <<endl;
} // will return a repeated double digit i.e. 11, 22, 33, 44

【问题讨论】:

  • 相同的种子 -> 相同的数字序列。您的程序播种它,然后获取一个数字,然后再次播种(使用相同的种子),然后获取相同的数字。
  • 将这个:srand(time(0)); 移动到main() 的顶部。除非你是故意播种的,否则它是每个进程一次的事情(从表面上看,你不是)。
  • 当我再次播种时,种子不是因为时间不同而改变吗?
  • 只播种一次,然后生成你想要的一切。附带说明,如果您可以使用 C++11,请不要使用 rand()
  • 时间并没有那么不同。在大多数系统上,time() 是自纪元以来的秒数,并且在您的第一次和第二次调用之间不会有一秒钟。我同意 Atlas,使用 &lt;random&gt;。如果你有的话,它真的是猫的睡衣。

标签: c++ random srand


【解决方案1】:

rand() 是“伪随机”生成器。这意味着它使用数学函数从前一个值生成下一个值。

srand() 为后续调用“rand()”设置初始“种子”值。如果您播种相同的值,您将获得相同的随机序列。如果使用当前时间播种,则每秒的顺序会有所不同。

只调用一次:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int random(){
    return(1+rand() % 6);
}

int main(){
    srand(time(0));

    cout<< random() <<endl;
    cout<< random() <<endl;
}

【讨论】:

    【解决方案2】:

    srand() 为随机生成器提供种子。 rand() 是一种基于种子生成随机数的算法。因此,您只需在程序中调用一次srand()。继续阅读以了解更多...

    而且,后续调用rand() 会自动生成不同的号码。例如

    while (1){
        printf("%d ",rand()%100);
    }
    

    将打印一个不同的数字列表,例如5 34 65 23 56 ...

    在实施之前,请注意time(NULL) 每秒更新一次。相反,在int main(){ 的开头添加一次srand(time(NULL));

    祝你好运!

    【讨论】:

    • NULL0 相同。
    • 等等,真的吗?其余的建议也适用。编辑...
    • In C++, the definition of NULL is 0, so there is only an aesthetic difference. ... Another problem with NULL is that people sometimes mistakenly believe that it is different from 0 and/or not an integer. - Bjarne Stroustrup.
    猜你喜欢
    • 1970-01-01
    • 2018-06-25
    • 2012-12-17
    • 2012-08-10
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    相关资源
    最近更新 更多