首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::mt19937不返回随机数

std::mt19937不返回随机数
EN

Stack Overflow用户
提问于 2015-04-10 06:04:44
回答 2查看 14K关注 0票数 3

我有下面这段代码:

代码语言:javascript
复制
unsigned int randomInt()
{
    mt19937 mt_rand(time(0));
    return mt_rand();
};

如果我调用这段代码,比如在for循环中调用4000次,我不会得到随机的无符号整数,相反,我会得到1000次一个值,接下来1000次我会得到下一个值。

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-10 06:43:12

这是因为您在一个循环中调用f 4000次,所需时间可能不到1毫秒,因此每次调用time(0)都返回相同的值,因此使用相同的种子初始化伪随机生成器。正确的方法是一次性初始化种子,最好是通过std::random_device,如下所示:

代码语言:javascript
复制
#include <random>
#include <iostream>

static std::random_device rd; // random device engine, usually based on /dev/random on UNIX-like systems
// initialize Mersennes' twister using rd to generate the seed
static std::mt19937 rng{rd()}; 

int dice()
{
    static std::uniform_int_distribution<int> uid(1,6); // random dice
    return uid(rng); // use rng as a generator
}

int main()
{
    for(int i = 0; i < 10; ++i)
        std::cout << dice() << " ";   
}
票数 13
EN

Stack Overflow用户

发布于 2015-04-10 06:18:07

随机性的来源是属于整个程序的资源,而不是属于单个函数的资源。您不应该在用于返回随机值的例程中创建随机性来源。

好的选项包括:

  • 将随机源传递到您的函数中
  • 使您的随机源成为全局变量
  • 使您的随机源成为静态变量,以便初始化只发生一次。

你可能认为不应该尝试做的一件事是用一个分辨率更高的类似函数替换time(0);虽然你会得到不同的结果,但这仍然会生成质量很差的随机数,甚至可能比正确生成随机数慢得多。(我相信有一些随机数生成器可以在这种用法下正常工作,但它们必须为此目的而设计)

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

https://stackoverflow.com/questions/29549873

复制
相关文章

相似问题

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