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

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

2019-2-21 18:03
9275

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

为什么不推荐用rand()函数,可以看看bf9K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6U0L8$3c8W2k6X3!0J5j5$3g2K6i4K6u0W2j5$3!0E0i4K6u0r3j5X3I4G2k6#2)9J5c8X3g2F1N6s2u0&6i4K6u0r3y4U0p5#2z5o6N6Q4c8e0y4Q4z5o6m8Q4z5o6t1`.

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

感兴趣的读者可以戳此ab1K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6L8$3k6@1N6$3q4J5k6g2)9J5k6h3W2F1N6r3g2D9i4K6u0W2j5$3!0E0i4K6u0r3k6h3&6Q4x3X3c8#2M7#2)9J5c8X3u0D9L8$3N6K6i4K6u0r3x3U0l9I4x3W2)9J5c8U0p5I4i4K6u0r3x3e0N6Q4x3V1k6@1K9r3g2Q4x3X3c8V1K9h3k6X3k6i4u0W2L8X3y4W2i4K6u0V1j5X3g2@1N6$3g2W2L8W2)9J5k6s2u0V1M7X3q4F1k6q4)9J5k6r3q4F1k6q4)9J5k6s2u0V1M7$3g2W2k6l9`.`.

首先检测当前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]

吾爱同步 9e7K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3f1#2x3Y4m8G2K9X3W2W2i4K6u0W2j5$3&6Q4x3V1k6@1K9s2u0W2j5h3c8Q4x3X3b7^5y4K6f1J5z5o6q4Q4x3X3b7I4i4K6u0V1x3g2)9J5k6h3S2@1L8h3H3`.


[培训]科锐软件逆向54期预科班、正式班开始火爆招生报名啦!!!

收藏
免费 3
支持
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  Editor   +1.00 2019/02/25 感谢分享~
最新回复 (5)
雪    币: 46700
活跃值: (67331)
能力值: (RANK:145 )
在线值:
发帖
回帖
粉丝
2
感谢分享~希望以后多多发帖哦~
2019-2-21 18:37
0
雪    币: 66
活跃值: (3428)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
赞一个,这两种方法都很好啊,彻底放弃 rand伪随机
2019-2-22 15:43
0
雪    币: 5161
活跃值: (3109)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
2019-2-22 23:55
0
雪    币: 76
活跃值: (208)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
谢谢分享!
2019-2-25 10:31
0
雪    币: 29893
活跃值: (3302)
能力值: ( 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
游客
登录 | 注册 方可回帖
返回