質問: ランダムな値を返すメソッドを調べていてふと気がついたのですが、プログラムのみで完全にランダムな値を返すことは可能なのでしょうか? 乱数の生成にはシード値が必要となりますよね。時間をミリ秒まで拡大した値をシード値にしたり、タスクのプロセスIDをシード値にしたりすることでかなりユニークなシード値は手に入ります。しかし、ソフトウェアの仕様上、ミリ秒やプロセスIDが判明すればシード値が判明するわけであり、完全にランダムなシード値は得られなくなりますよね。 こういった性質をふまえたうえで、プログラムやソフトウェアのみで完全にランダムなシード値を獲得する方法はあるのでしょうか? プログラムだけではなく特別な装置やハードウェアが必要になってくるのでしょうか?
回答: どこまでを「特別な装置やハードウェア」と考えるかは人それぞれなので、参考情報として。 プログラムは書いた通りにしか動作しないため、ランダムとて書かれた通りの動作をするだけです。何らかの外部情報が必要です。 2012年発表のIvy Bridgeマイクロアーキテクチャ以降には乱数ジェネレータが搭載され、それを呼び出す`RDRAND`命令 / `RDSEED`命令が用意されています。C/C++言語からは`_rdrand64_step`等の関数名で呼び出すことが可能です。 OSレベルでは、Linuxを中心に`/dev/random`が用意されています。またWindowsにおいても暗号ライブラリの一部として`CryptGenRandom` APIが用意されています。どのような実装が行われるかはプラットフォーム依存ではありますが、アプリケーションから見れば、そこそこにランダムな値が得られることが期待されています。 C++言語の``乱数ライブラリには`std::random_device`クラスが用意されています。どのような実装が行われるかはやはりプラットフォーム依存ではありますが、`RDRAND`や`/dev/random`等が使われることが想定されています。