偏りのある乱数を生成する

整数乱数が欲しいので、実数の話はしません。



偏った乱数が欲しくなったので、コードを書いてみようと思う。

正規分布や二項分布のような数学的なものが欲しいのではなく、ゲームとか適当な実装に使えるような手抜き乱数が欲しい。

出現比


ぱっと思いついたのは、インデックスに対して出現比を割り当て、それを基に乱数を生成する方法。

こんな感じの求め方。図中のrand()は一様分布で生成される乱数。
20161119_biasrand.png

ここまでやって気がついたのですが、std::discrete_distributionというのがあるらしいです。あるのか・・・。


分布関数の逆関数


分布関数の逆関数を使う方法がある・・・が、あれは[0,1]の範囲で、実数に限られたもの。

適当にごまかした実装がこちら。

random_device noize;
mt19937 mt(noize());

int biased_rand2(function<int(int)> f,uniform_int_distribution range){
return f(range(mt));
}

// つかいかた。
// 1から100までの乱数を得る。
// 1の出現比は2*2-1*1=3。100の出現比は、101*101-100*100=201。
int r = biased_rand2([](int x){return (int)sqrt(x);},uniform_int_distribution<int>(1,10200));


僕の頭では偏りそうやなぁ、という見積もりぐらいしかできないです。

2つのサイコロの出た目の和は偏る


という考えをそのまま流し込んだコードです。

random_device noize;
mt19937 MT(noize());

int randInt(int from, int to) {
uniform_int_distribution rand(from, to);
return rand(MT);
}
// 0からsizeまでの乱数を得る。divider4でもかなり尖る。
int biased_rand3(int divider,int size){
int r=0;
for (;0<divider;divider--){
r+=randInt(0,size/divider);
size-=size/divider;
}
return r;
}
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

舞葉(ぶよう)

Author:舞葉(ぶよう)
github.io
はてなブログ(競プロ)

古い記事のソースコードは色分けしていないので、高機能テキストエディタに貼り付けたほうが見やすいかも。

検索フォーム
このブログについて
自分がつまづいた話題、なんとなく書きたいと思ったこと、ググったけど殆ど資料なかったぞオイ な話等をアップする予定。通りすがりでも、参考になっていただければと。プログラムの例外入力、メモリリークは責任負いません。投稿された記事は修正・削除する場合があります。
カテゴリ
タグ

HSP3アルゴリズムとデータ構造c++RubyJavaUnity画像解析C機械学習C#LinuxcodeIQKinectMinecraftTonyuSystemraspberrypiPythonHTML5音声制御Simulinkruby俺ルール通信制御Javascriptシミュレーション

counter-shinobi
固定記事
最新記事
最新コメント
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

アクセスランキング
[ジャンルランキング]
コンピュータ
1253位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
219位
アクセスランキングを見る>>