乱数発生のアルゴリズム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
TTS

乱数発生のアルゴリズム

#1

投稿記事 by TTS » 5年前

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

宜しくお願いします。



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

アバター
usao
記事: 1887
登録日時: 11年前

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

#2

投稿記事 by usao » 5年前

> 任意の(指定した)分布p(x,y)から乱数を発生する
…の意味がよくわりませんが,
何らかの偏りがある乱数をつくりたいという話でしょうか.

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

TTS.

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

#3

投稿記事 by TTS. » 5年前

ご回答ありがとうございます。

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

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

アバター
usao
記事: 1887
登録日時: 11年前

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

#4

投稿記事 by usao » 5年前

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

アバター
usao
記事: 1887
登録日時: 11年前

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

#5

投稿記事 by usao » 5年前

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

.TTS.

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

#6

投稿記事 by .TTS. » 5年前

usao さま

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

返信

“C言語何でも質問掲示板” へ戻る