ページ 11

乱数発生のアルゴリズム

Posted: 2018年8月04日(土) 07:43
by TTS
任意の(指定した)分布p(x,y)から乱数を発生する具体的な算法を教えていただけませんか。
(ライブラリーを利用するのではなく、自分で実装するための原理を知りたいのです。)

宜しくお願いします。



ーーーーーーーーーーーーーーーーーーーーーーー
int a = 1 < 2 * 3; = 1だろ?

Re: 乱数発生のアルゴリズム

Posted: 2018年8月05日(日) 11:57
by usao
> 任意の(指定した)分布p(x,y)から乱数を発生する
…の意味がよくわりませんが,
何らかの偏りがある乱数をつくりたいという話でしょうか.

であれば,素人考えでは…
0~1の範囲の一様乱数Xを(標準のrandとかで)得られるとき,
確率密度関数の積分値がXになるような積分区間を解いて,その区間値を乱数の結果とすればどうかな,と.

Re: 乱数発生のアルゴリズム

Posted: 2018年8月05日(日) 15:57
by TTS.
ご回答ありがとうございます。

数学原理的に仰るとおりだと思いますが、実際そういうふうに実装されるかどうかにちょっと疑問です。

例えば、2D分布の場合、そういう原理的な計算法だと、乱数対(x,y)を生成するには相当時間かかるはず。。。
これまで、CPU 1-threadで乱数を発生した場合(C言語)、そんなに時間かからなかった感じですね。

Re: 乱数発生のアルゴリズム

Posted: 2018年8月06日(月) 10:22
by usao
実際の実装というのはわかりませんが,
C++のdistribution系のソースを見るとかできれば何かわかるのかも??
オフトピック
自分が思いつく方法としては,
ある特定の分布を対象にした実装をするのであれば,積分区間を解くには
「例えばある程度の荒さのヒストグラム的なものを用意しておいて,そこから初期値を決定し,
 後はNewton法みたいなのを使ってたかだか数回iteration計算すれば十分」とかなんかそんな感じのを試すかも?
(この時点でもう既に遅いという話もありそうですが…)
分布が2次元でも,1次元の問題×2に分割するんじゃないでしょうか.
(2次元の分布をスライスした断面図の面積を確率とする1次元の分布に関してやる感じで)

Re: 乱数発生のアルゴリズム

Posted: 2018年8月06日(月) 10:26
by usao
任意の分布を指定できるものとなると難しそうですね.
(私が書いてるような方法論だと,確率密度関数そのものじゃなくて,累積分布を指定してもらわないとダメな形になりそうですね…)

Re: 乱数発生のアルゴリズム

Posted: 2018年8月06日(月) 12:15
by .TTS.
usao さま

ありがとうございます。
貴重なアイディア参考させていただきます。