プロセスIDを擬似乱数生成関数の初期化パラメータに使う是非

提供:UnixClassWiki
2019年1月7日 (月) 10:42時点におけるHironobu (トーク | 投稿記録)による版 (ページの作成:「 よく下のような擬似乱数生成関数の初期化で与えるパラメータ(SEED)の値をプロセスIDにするサンプルコードを見かけます。...」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動


よく下のような擬似乱数生成関数の初期化で与えるパラメータ(SEED)の値をプロセスIDにするサンプルコードを見かけます。


#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int main(void)
{
  int i;
  srand((int)getpid());
  printf("PID %d\n", getpid());
   for (i = 0; i < 5; i++)
   {
     printf("%d: random  %d\n", i, rand());
   }
}

サンプルコードとして理解するのは良いでしょうが、このようなコードは実際のプログラムでは書くべきではありません。 理由はプロセスIDは2^15で循環している値と変動の幅が小さく生成された擬似乱数のパターンが簡単に再現出来てしまうからです。 さらにプログラムがブート時にこのようなプログラムが稼働してしまった場合、プロセスIDは毎回似たような値になります。

予見できない(擬似)乱数の列が欲しい場合、/dev/randomを使うなど工夫が必要です。