搜索
热搜: NOIP OIer 神牛
查看: 438|回复: 0

mt19937伪随机数生成器

[复制链接]

35

主题

54

帖子

4532

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4532
发表于 2023-1-6 16:55:35 | 显示全部楼层 |阅读模式
传统随机数生成器
srand(time(0)):指定随机数种子,会影响后面的随机数
rand():获得随机数,在windows下生成的数据范围为0-32726
示例:生成20个 1~10之间的整数。
int main()
{
srand(time(0));
int ans;
int b=10;
for(int i=1;i<=20;i++)
{
ans=1+rand()%(b-1);
cout<<ans<<' ';
}
return 0;
}
mt19937
mt19937是C++11新加入的伪随机数产生器,用于产生高性能、分布均匀的随机数。头文件:#include<random>,返回值为unsigned int。该算法由松本眞(Makoto Matsumoto)和西村拓士(Takuji Nishimura)在 1997 年提出,期间还得到了「算法之神」高德纳(Donald Ervin Knuth)的帮助。
mt是因为这个伪随机数产生器基于Mersenne Twister(梅森旋转)算法。
19937 则取自算法中用到的梅森素数2^19937-1,梅森素数是算法生成伪随机数的循环长度(period),而旋转则说的是算法内部对定长二进制串循环位移的过程。
std::mt19937  32位
std::mt19937_64 64位
#include<random>
#include<ctime>
typedef std::mt19937  Random_mt19937;
Random_mt19937  rnd(time(0));
int main()
{
printf("%d\n",rnd());
return 0;
}
C++里还有另外一个东西 std::random_device,在linux系统下是按照熵池来生成的,“在熵池耗尽前可以高速生成随机数”。可以用 std::random_device 给 std::mt19937 生成种子:
int main()
{
random_device seeds;
mt19937 example(seeds());
cout << example() << endl;
return 0;
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

津ICP备19006949号-1 | 津公网安备12010102000465号

快速回复 返回顶部 返回列表