メモ用なので適当に書く.
目次
1以上M以下の整数からなる長さNの数列
長さ,である数列を一様ランダムに生成する.重複あり数列の要素に重複があってもよい場合を考える.
各要素の生成確率をとしてもよい.
重複なし数列の要素が互いに異なる場合を考える.
前から順にまだ使ってない数を等確率で使う.
N個からM個選ぶ組み合わせ
1以上M以下の整数からなる長さNの数列と同じように選ぶ,順番は無視.1以上M以下の整数からなる長さNの単調増加数列
N個からM個選ぶ組み合わせと同じ.総和がMとなる非負整数からなる長さNの数列
個の"〇"と個の"|"を並べるやつ.個の"〇"から"|"にする個を選ぶと考えるとN個からM個選ぶ組み合わせと同じ.
括弧列
バランスのとれた括弧列の一様ランダムな生成.いわゆる構成比法で生成する.括弧列は,以下の図の右下から左上への経路と対応するため経路をランダムに生成することを考える.
毎回,上か右を選択して移動するが,どのような確率で選択すればよいか.
それは,「上に行った場合の残りの経路数」と「右に行った場合の残りの経路数」の比率で遷移の確率が決まる.
これを用いて,上を選択する確率を求めると,
となる.ただし,は現在地から右上の点までの上方向の遷移回数で,は現在地から右上の点までの右方向の遷移回数.
初期値は,長さの括弧列を生成するとして,であり,
上を選ぶと,右を選ぶととなる.
二分木
括弧列をとして再帰させれば1対1対応が取れる.ラベル付き木
prufer列と対応が取れるので1以上M以下の整数からなる長さNの数列を使う.次数列を持つグラフ
与えられた次数列を持つグラフを一様ランダムに生成する.Fast uniform generation of random graphs with given degree sequences
個数上限付き01列
の数が個以下,の数が個以下の長さの01列をできるだけ一様なランダム生成する.また,以下の条件を満たす.の個数をと決めるとN個からM個選ぶ組み合わせとして生成できる.
の個数がとなる確率は,
となる.
が小さければそのまま,が大きければラプラスの定理を用いることで計算できる.
境界はとかでいいかも.
N頂点M辺の連結グラフ
すぐに思いつく方法として,頂点の木をランダム生成した後,辺の数がになるまでランダムに辺を追加するというものがある.しかしこれだと,全域木の数に無視できないほどの差があるため一様ランダムな生成とは言えない.頂点辺の連結グラフを生成する方法はいくつかある.
生成検査法
の辺から本選んでグラフを作る.作ったグラフが連結なら終了.そうでなければまた生成を行う.この方法は一様ランダムに生成できるが,とが近い場合,連結となる確率が低いため生成回数が増大する恐れがある.
全域木法
頂点の木を生成する[ラベル付き木の生成].この木に本の辺を追加する.この方法は高速に生成できるが,一様ランダムにはならない.
構成比法
特定の性質を持つグラフの数に応じた確率を用いることで,比較的速く(それでもまだ遅い),一様ランダムに生成できる.構成比近似法
構成比法では構成比の計算に時間がかかっていた.構成比近似法では構成比の近似値を用いることで高速な生成が可能になる.ほぼ一様ランダムになる.構成比近似法
重複上限Kの数列
以上以下の整数からなる長さの数列であって,同じ数が出現する回数が回以下であるものをランダム生成したい.が小さかったり,かつがある程度大きかったりすると生成検査法で高速に一様ランダムに生成できる.
のときはからまで順に,空いているところから箇所選んで決めていく方法で一様ランダム生成できる.
は使ってない整数から一つ選んで前から埋めていけばよい.
生成検査法で回で条件を満たす確率は,年が日であり,人のうち同じ誕生日の人組が存在しない確率と同じ.(誕生日のパラドックス)
ラベル無し根付き木
https://citeseerx.ist.psu.edu/document?repid=rep1&type=pdf&doi=b169f11a617bab9395da9f880ce677ca520b2348https://www2.math.upenn.edu/~wilf/website/CombinatorialAlgorithms.pdf
ラベル無し木
https://www2.math.upenn.edu/~wilf/website/Free%20trees.pdf木の総数の近似
N以下の素数
以下の素数を一様ランダムに生成するミラーラビンを使った生成検査法
素数定理から比較的早く生成できることがわかる
全域木
与えられたグラフの全域木を一様ランダムに生成する.http://jakub.tarnawski.org/slides_soda_2015.pdf
ライブラリ
github.comrand_lab_free_trees() | ラベル付き木の一様ランダム生成 |
rand_lab_rooted_trees() | ラベル付け根付き木の一様ランダム生成 |
rand_ulab_free_trees() | ラベル無し木の一様ランダム生成 |
rand_ulab_rooted_trees() | ラベル無し根付き木の一様ランダム生成 |