C言語の標準で用意されている乱数がなぜ推奨されないのか教えてください。


C言語の標準で用意されている乱数がなぜ推奨されないのか教えてください。




一般論として標準Cの`rand`が推奨されいてないという事実はありませんが、注意すべき点はいくつかあります。

## 標準Cでは実装を規定していない

たとえば、`srand`に同じseedを与えても、環境が違うと生成される乱数列は異なる可能性があります。どの範囲の値を返すかも実装依存です。

## 品質の良い疑似乱数生成器が使われているとは限らない

後方互換性などの観点で、古くからの実装が継続して使われている場合、品質に問題があることがわかっているアルゴリズムがそのまま使われている場合があります。よく使われていた線形合同法は、周期が短く、ランダム性にも問題があることがわかっています。

## セキュリティ用途には使ってはいけない

これに関しては明確に推奨されていません。暗号論的疑似乱数生成器を使用しなければなりません。暗号に使う鍵はもちろんですが、セッションのトークンなどもこれに含まれます。

