タグ

確率とrandomに関するtomio2480のブックマーク (2)

  • Cのrand()よりmt19937の方が速いことがあるという話 - Educational NLP blog

    おはようございます。2年ぶりの記事ですね。 もう1月程前になってしまいましたが、id:sleepy_yoshi:20130720 で id:sleepy_yoshi さんが高速な非復元抽出をやっておられ、その中で、Cのrand関数を使っておられました。僕は、普段、std::mt19937を使っていたので、ちょっと比較してみた、という記事です。 C++11では、大別して、2つの擬似乱数生成の方法があります。1つはC(cstdlib)のrand関数で、高速ですが乱数の質が低く、もう1つはrandomヘッダのmt19937(メルセンヌ・ツイスタ)で、低速ですが乱数の質が高い(科学実験に適する)と、一般には思われていると思います。この高速・低速ですが、mt19937を使うことがボトルネックになるほど遅いことは殆どない、というのが今までの実感でした。なので、僕は、非復元抽出のような処理では、特にボト

    Cのrand()よりmt19937の方が速いことがあるという話 - Educational NLP blog
  • いつからその方法で偏りのない乱数が得られると錯覚していた? - アスペ日記

    私はつい最近まで勘違いしていました。 ここのページに書いてあるような方法で、一様分布する整数が得られると。 int random(int n) { return (int)(( rand() / (RAND_MAX + 1.0) ) * n); } この方法、一見すると実に一様分布が得られそうに見えるんですよね。 どういう思考回路を通っているかというのを自己分析すると、次のような感じです。 1. rand() では 0〜RAND_MAX のランダムな整数が得られる。 2. それを RAND_MAX + 1 で割ると、[0, 1) に一様分布する実数が得られる。 3. [0, 1) の一様な実数を n 倍して小数点以下を切り捨てたら、0 から n-1 に一様分布する整数が得られる。 これの罠なところは、1 と(特に)3 が正しいというところだと思います。 ただ、2 がダウト。 思いっきりダウ

    いつからその方法で偏りのない乱数が得られると錯覚していた? - アスペ日記
  • 1