真正的隨機值生成器

要生成可用於加密的真隨機值,必須將 std::random_device 用作生成器。

#include <iostream>
#include <random>

int main()
{
   std::random_device crypto_random_generator;
   std::uniform_int_distribution<int> int_distribution(0,9);
   
   int actual_distribution[10] = {0,0,0,0,0,0,0,0,0,0};
   
   for(int i = 0; i < 10000; i++) {
       int result = int_distribution(crypto_random_generator);
       actual_distribution[result]++;
   }

   for(int i = 0; i < 10; i++) {
       std::cout << actual_distribution[i] << " ";
   }
   
   return 0;
}

std::random_device 的使用方式與使用偽隨機值生成器的方式相同。

然而,如果非確定性源(例如,硬體裝置)不可用於實現,可以根據實現定義的偽隨機數引擎來實現 std::random_device

通過 entropy 成員函式 (當生成器完全確定時返回零) 可以檢測到這樣的實現,但許多流行的庫(GCC 的 libstdc ++和 LLVM 的 libc ++)總是返回零,即使它們使用高質量的外部隨機性。