

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


CC BY-SA 3.0
2015-12-28T12:15:01.640
20431
2015-12-30T00:21:06.557
13656
question
c
C言語の標準で用意されている乱数がなぜ推奨されないのか教えてください。


[C言語による乱数生成](http://www.sat.t.u-tokyo.ac.jp/~omi/random_variables_generation.html)

>
> 擬似乱数は決定論的なアルゴリズムから生成されているため、乱数と違い周期性、予測可能性や分布の偏りがどうしても生じてしまう。そのため研究等で精度の高い解析を得るためには、精度の高い生成アルゴリズムを用いることが重要である。


CC BY-SA 3.0
2015-12-28T12:27:17.393
20432
2015-12-28T12:27:17.393
9008
20431
answer


C言語の言語標準の中では、疑似乱数を生成するための方法やアルゴリズムについては定義されていません。そのためどのような乱数が生成されるかは、C言語の実装に依存します。実行環境が変わると再現性が無くなってしまうため、研究などで再現性が必要な場合には独自に疑似乱数を実装する事が必要になります。  
例えば線形合同法を使っている実装が多いですが、同じ線形合同法でも使用する定数値によって生成される乱数列が変わってきます。実装に使用している定数値が異なる可能性があるので、常に同じ結果が出て欲しい場合には、独自に実装する必要が生じます。


CC BY-SA 3.0
2015-12-28T19:47:41.813
20439
2015-12-28T19:47:41.813
12774
20431
answer


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

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

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

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

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

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

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


CC BY-SA 3.0
2015-12-30T00:21:06.557
20461
2015-12-30T00:21:06.557
5793
20431
answer