いけむランド

はてダからやってきました

random_device: rdrand failed on x86_64-on-ARM64

Cygwin x86_64-on-ARM64 環境で std::randon_device のコンストラクタを引数なしで呼び、rd() を呼ぶと発生する。

#include <random>

int main(int argc, char** argv)
{
  std::random_device rd;
  return rd();
}
$ ./a.exe
terminate called after throwing an instance of 'std::runtime_error'
  what():  random_device: rdrand failed
[1]    36278 abort      ./a.exe

cpprefjp.github.io

  • GCC (libstdc++): "default" (デフォルト)、 "/dev/urandom" または "/dev/random"
    デフォルトでは、CPU の RDRAND 命令が使用できれば ( _GLIBCXX_X86_RDRAND が定義されていれば) それを、そうでなければ /dev/urandom から値を取得する

Cygwin 向けの libstdc++ ではコンパイル時に rdrand が使えると判断されている模様。

github.com

当然ながらコンストラクタの引数に "/dev/urandom" とかを渡せば、x86_64-on-ARM64 環境 でもきちんと動作する。