第一次发帖,还请大佬们轻拍。
为什么不推荐用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期预科班、正式班开始火爆招生报名啦!!!