Skip to content

Instantly share code, notes, and snippets.

@gfx
Created August 19, 2010 05:51
Show Gist options
  • Select an option

  • Save gfx/537150 to your computer and use it in GitHub Desktop.

Select an option

Save gfx/537150 to your computer and use it in GitHub Desktop.
Perlの乱数についてIRCで盛り上がったのでまとめておく。
結論からいうと、srand()はPerl5組み込みのものでよい。乱数の生成はMath::Random::MTがよいとおもう。
Perlのrand()の実装はConfigure時に選べるようだが((perl -V:randfunc でかくにんできる))、ふつうはdrand48()がつかわれる。これは下位ビットがまったくランダムでないことで知られるrand(3)よりはましだが、しょせん線形合同法なのでセッションIDなどを作るのには安全ではない。安全な乱数を作るためにtime()やSHA1を混ぜ込んだりするほうほうもよくつかわれるが、そのくらいならはじめからM::R::MTを使ったほうがいいとおもう。
なお、srand()はあれば/dev/urandomを読むので、自前でsrand(time)などとするのはよくない。また、最初にrand()を呼ぶときに自動的に呼ばれるので、ふつうは明示的によぶひつようすらない。ただし、どこかでrand()してからfork(2)をすると、サブプロセスで乱数系列がすべておなじになってしまうので注意がひつようである。
id:kazuho++ id:sfujiwara++
参考文献:
- http://wellington.pm.org/archive/200704/randomness/index.html#slide0
- Perl_seed()@util.c, pp_rand()@pp.c
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment