首页
社区
课程
招聘
[原创]正确生成随机数的两种姿势
发表于: 2019-2-21 18:03 8090

[原创]正确生成随机数的两种姿势

2019-2-21 18:03
8090

第一次发帖,还请大佬们轻拍。

为什么不推荐用rand()函数,可以看看https://codeforces.com/blog/entry/61587。

RDSEED,RDRAND是两个汇编指令,通过硅片上的热噪声来生成随机数。

从Intel Broadwell架构的 CPU 和AMD Zen架构的 CPU开始支持此指令

在AMD和Intel的CPU上,可以使用CPUID指令来检测CPU是否支持RDRAND指令。如果支持该指令,调用CPUID的01号标准函数之后,ECX寄存器的第30位会被设置成1。

从RDSEED指令获取输入流比从RDRAND获取要慢。

关于RDSEED和RDRAND指令的区别和具体工作,文献很少。笔者从INTEL官网找到了相关文章。

大意就是如果打算用来作为其它伪随机数生成器(pseudorandom number generator)的种子的时候,可以使用RDSEED,其他情况则使用RNRAND

感兴趣的读者可以戳此https://software.intel.com/en-us/blogs/2012/11/17/the-difference-between-rdrand-and-rdseed

首先检测当前CPU是否支持RDRAND,我们通过调用CPUID的01号标准函数,根据执行后的ECX寄存器第30位是否为1来判断。如果为1,则支持。

核心代码就是rdrand eax将生成的随机数放到eax寄存器中

下面是自己写的生成100个随机数生成的代码,仅供参考。

mt19937是什么?它是c++11中加入的新特性,是一种随机数算法。

总的一点,相对于传统的srand(),mt19937拥有更好的性能。

具有速度快,周期长的特点(它的名字便来自周期长度:2^19937-1)

rand()函数在windows下生成的数据范围为0-32767

但是这个mt19937的随机范围在(−MAXINT,+MAXINT) (其中MAXINT为int的最大值)

它的使用非常简单

另外,random_shuffle使用的时自带的rand()

我们可以把rnd函数传入shuffle,使shuffle更随机

这样就能让数组内的元素随机移动足够大的距离

关于mt19937具体可以见std::mt19937

总体来说,mt19937使用很方便,RDRAND作为CPU层面的随机数,具有更佳的表现。[/md]

吾爱同步 https://www.52pojie.cn/thread-875281-1-1.html


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 3
支持
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  Editor   +1.00 2019/02/25 感谢分享~
最新回复 (5)
雪    币: 27069
活跃值: (62999)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
2
感谢分享~希望以后多多发帖哦~
2019-2-21 18:37
0
雪    币: 66
活跃值: (2681)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
赞一个,这两种方法都很好啊,彻底放弃 rand伪随机
2019-2-22 15:43
0
雪    币: 4851
活跃值: (2759)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
2019-2-22 23:55
0
雪    币: 97
活跃值: (147)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
谢谢分享!
2019-2-25 10:31
0
雪    币: 30050
活跃值: (2422)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
我一般是使用系统的RSA库生成的随机数。。。

    ret = CryptAcquireContextW(&hProv,
                             NULL,
                             NULL,
                             PROV_RSA_FULL,
                             CRYPT_VERIFYCONTEXT);
ret=CryptGenRandom(hProv, xxxxxxxxxxxxxxxxxxxxxx,你要的随机数
CryptReleaseContext(hProv, 0);


2019-3-1 19:08
0
游客
登录 | 注册 方可回帖
返回
//