工作示例使用C语言编写的英特尔RdRand。如何生成-100.001到+100.001

时间:2017-04-13 10:08:34

标签: c intel rdrand

有一个英特尔DRNG库,允许您根据处理器的晶体熵效应使用随机数生成器。

图书馆本身及其使用说明:https://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-library-implementation-and-uses

库中有一个示例,它只打印随机生成的数组的内容。

请分享C中的工作示例,该示例允许使用此库生成-100.001到+100.001范围内的浮点类型编号

我只能找到一个基于伪随机数生成器的代码,但它不是我需要的:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

float randoms(float min, float max)
{
    return (float)(rand())/RAND_MAX*(max - min) + min;
}

int main()
{
    srand((unsigned int)time(0));
    printf("%f\n",randoms(-100.001, 100.001));
    return 0;
}

提前致谢。

1 个答案:

答案 0 :(得分:3)

答案已于不久前发布on the Intel's DRNG page。我想在这里引用它:

  

您几乎可以使用相同的算法。你只需要一种方法来检查   对于(非常不可能)RDRAND指令不会的机会   返回一个值。

     

以下是我将如何修改Linux的代码段(您需要   提供 -mrdrnd选项到gcc来编译这个):

#include <stdio.h>
#include <limits.h>

char randoms(float *randf, float min, float max)
{
    int retries= 10;
    unsigned long long rand64;

    while(retries--) {
        if ( __builtin_ia32_rdrand64_step(&rand64) ) {
            *randf= (float)rand64/ULONG_MAX*(max - min) + min;
            return 1;
        }
    }
    return 0;
}

int main()
{
    float randf;

    if ( randoms(&randf, -100.001, 100.001) ) printf("%f\n", randf);
    else printf("Failed to get a random value\n");
    return 0;
}
  

见上文所述的4.2.1节:

     

4.2.1重试建议

     

建议应用程序在紧密循环中尝试重试   万一RDRAND指令不返回a   随机数。该数字基于二项式概率   论证:考虑到DRNG的设计余量,可能性为10   连续失败天文数字很小,实际上是一个   指示更大的CPU问题。