簡體   English   中英

工作示例使用C語言編寫的英特爾RdRand。 如何生成-100.001到+100.001范圍內的浮點類型編號

[英]Working example Intel RdRand in C language. How to generate a float type number in the range -100.001 through +100.001

有一個英特爾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;
}

提前致謝。

答案已經在不久前發布在英特爾的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重試建議

建議應用程序在RDRAND指令不返回隨機數的情況下,在緊密循環中嘗試重試10次。 這個數字基於二項式概率論證:給定DRNG的設計余量,連續十次失敗的幾率是天文數字小,實際上是一個更大的CPU問題的指示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM