1

有一个英特尔 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;
}

提前致谢。

4

1 回答 1

4

答案已在不久前发布在英特尔的 DRNG 页面上。我想在这里引用它:

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

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

#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 重试建议

建议应用程序在紧密循环中尝试 10 次重试,以防万一 RDRAND 指令不返回随机数。这个数字基于二项式概率论:给定 DRNG 的设计余量,连续 10 次故障的可能性很小,实际上表明 CPU 问题更大。

于 2017-05-09T19:17:57.197 回答