首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于调用srand的说明

关于调用srand的说明
EN

Stack Overflow用户
提问于 2019-05-28 19:12:29
回答 1查看 53关注 0票数 0

我想知道为什么在程序的开始阶段使用srand比在我使用它的地方更有优势。

我在程序开始时生成伪随机数,但是当我在调用srand生成数字的函数中播种srand时,我同样会得到这些数字。

代码语言:javascript
复制
#include <iostream>
#include <ctime>
using namespace std;

int rng()
{
    const int SIZE = 10;
    int rng[10];
  srand(time(NULL));
    for (int i = 0; i < 10; i++)
    {
        rng[i] = rand() % 128 + 1;
        return rng[i];
    }

}

int main()
{
    int array;
  //srand(time(NULL)); If i put it here i get actual random numbers
    cout << "Welcome to the program";
    cout << "\nthis is your rng\n";
    for (int i = 0; i < 10; i++)
    {
        array = rng();
        cout << array << endl;
    }

    return 0;
}

当我运行程序时,所有的数字都是相同的,但是当我在rng函数中删除种子,并在main模块中取消srand的注释时,这些数字是伪随机的,这就是我想要的。我想知道为什么。我已经研究过了,听说我用一个时间来播种srand,当我运行那个函数时,循环迭代得如此之快,以至于所有的数字都是用相同的种子值生成的,所以它们都是相同的,但我想知道这和在main中使用srand( time (NULL))有什么不同,因为无论哪种方式,函数生成数字的速度都不是很快,他们无论如何都会得到相同的种子值。由于不同的输出,它看起来不是这样的,但我很好奇,为什么?

EN

回答 1

Stack Overflow用户

发布于 2019-05-28 19:49:07

time返回自1970年1月1日以来的秒数,因此在一秒内重复调用它将返回相同的值。你把srand放在哪里并不重要,只要它在所有rand调用之前,并且它应该在每个程序中只被调用一次,因为它是全局的,并且显然会重置随机序列。因此,如果只在需要的地方使用它,那么当代码的其他部分也需要它并再次调用srand时,它可能会干扰您的rand调用。根本不需要调用它,但种子始终是相同的。有一个选项可以确定地设置种子,这对调试很有好处。

也就是说,不要使用它,就是不要。

正如您所观察到的,time不是一个好的种子生成器,rand甚至不是一个好的随机数生成器,当然不适用于floatsx mod n。使用库。它有std::random_device,可以生成真正的随机数=好的种子。遗憾的是,这并不是必需的。除了最极端的随机性需求之外,std::mt19937是RNG的首选,再加上std::XX_YY_distribution,应该足以满足所有需求。它也是线程安全的,因为您可以控制对生成器的访问以及它的使用方式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56340922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档