73899


ランダムな値を返すメソッドを調べていてふと気がついたのですが、プログラムのみで完全にランダムな値を返すことは可能なのでしょうか？

乱数の生成にはシード値が必要となりますよね。時間をミリ秒まで拡大した値をシード値にしたり、タスクのプロセスIDをシード値にしたりすることでかなりユニークなシード値は手に入ります。しかし、ソフトウェアの仕様上、ミリ秒やプロセスIDが判明すればシード値が判明するわけであり、完全にランダムなシード値は得られなくなりますよね。

こういった性質をふまえたうえで、プログラムやソフトウェアのみで完全にランダムなシード値を獲得する方法はあるのでしょうか？
プログラムだけではなく特別な装置やハードウェアが必要になってくるのでしょうか？


CC BY-SA 4.0
2021-02-09T14:58:19.427
73897
2021-02-10T08:50:13.010
43413
question
random
プログラムのみで完全にランダムな乱数を生成することは可能ですか？


どこまでを「特別な装置やハードウェア」と考えるかは人それぞれなので、参考情報として。

プログラムは書いた通りにしか動作しないため、ランダムとて書かれた通りの動作をするだけです。何らかの外部情報が必要です。

2012年発表の[Ivy
Bridgeマイクロアーキテクチャ](https://ja.wikipedia.org/wiki/Ivy_Bridge%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3)以降には乱数ジェネレータが搭載され、それを呼び出す[`RDRAND`命令
/
`RDSEED`命令](https://en.wikipedia.org/wiki/RDRAND)が用意されています。C/C++言語からは[`_rdrand64_step`等](https://software.intel.com/sites/landingpage/IntrinsicsGuide/#cats=Random)の関数名で呼び出すことが可能です。

OSレベルでは、Linuxを中心に[`/dev/random`](https://ja.wikipedia.org/wiki//dev/random)が用意されています。またWindowsにおいても暗号ライブラリの一部として[`CryptGenRandom`](https://en.wikipedia.org/wiki/CryptGenRandom)
APIが用意されています。どのような実装が行われるかはプラットフォーム依存ではありますが、アプリケーションから見れば、そこそこにランダムな値が得られることが期待されています。

C++言語の[`<random>`乱数ライブラリ](https://cpprefjp.github.io/reference/random.html)には[`std::random_device`クラス](https://cpprefjp.github.io/reference/random/random_device.html)が用意されています。どのような実装が行われるかはやはりプラットフォーム依存ではありますが、`RDRAND`や`/dev/random`等が使われることが想定されています。


CC BY-SA 4.0
2021-02-09T22:04:57.720
73899
2021-02-09T22:04:57.720
4236
73897
answer


> プログラムやソフトウェアのみで完全にランダムなシード値を獲得する方法はあるのでしょうか？
> プログラムだけではなく特別な装置やハードウェアが必要になってくるのでしょうか？

大雑把な答えとしては：ソフトウェアのみで真にランダムなシード値を得る方法はありません。

IPAサイトにある [RFC1750 セキュリティのための乱雑性についての推奨事項(Randomness Recommendations for
Security)](https://www.ipa.go.jp/security/rfc/RFC1750JA.html)
が参考になると思います。要旨(Abstract)より一部引用します：

>
> これは、真に乱雑なハードウェアによるテクニックの利用を推奨し、「多くのシステム上の既存のハードウェアは、この目的のために使うことができること」を示します。これは、ハードウェアによる解決策が不能であるとき、問題を改善するための示唆を提供します。そして、これは、「何らかの特定のアプリケーションのために、このような数は、どの位大きい必要があるか」の例を与えます。

ハードウェア以外の手段として、ユーザ（ヒト）の操作情報を用いることもあります。一部の鍵生成ツールでは、ユーザにランダムなキー入力をさせたり、マウスカーソルをぐりぐり動かさせたりという要求を行うものがあります。

  * [公開鍵暗号を利用した認証 (PuTTY)](https://www.st.ryukoku.ac.jp/security/ssh/win/publickey.html)


CC BY-SA 4.0
2021-02-10T08:50:13.010
73913
2021-02-10T08:50:13.010
49
73897
answer