最終更新日時(UTC):
が更新

履歴 編集

乱数分布の図を作る方法

<random>ライブラリには、数多くの分布法に関するクラスが用意されています。その分布を可視化するために、それらのクラス概要ページには図を入れています。
ここでは、その図を作る方法を紹介します。

一様整数分布を行うstd::uniform_int_distributionクラスを例にします。

分布クラスのサンプルコード

分布クラスのサンプルコードは、生成された乱数の値を、TSV(タブ区切り)テキストとして出力する形にします。std::uniform_int_distributionのサンプルコードは、例として以下のようになっています。

#include <random>
#include <fstream>

int main() 
{
  std::random_device seed_gen;
  std::default_random_engine engine(seed_gen());

  // 0以上9以下の値を等確率で発生させる
  std::uniform_int_distribution<> dist(0, 9);

  std::ofstream result_file("uniform_int_distribution.tsv");
  for (size_t n = 0; n < 1000; ++n) {
    // 一様整数分布で乱数を生成する
    int result = dist(engine);

    result_file << result << "\t\n";
  }
}

これを出力すると、以下のようなファイル(uniform_int_distribution.tsv)が生成されます。

7
5
1
6
6
6
2
0
8
8
9
1
1
9
…

作成されたファイルは、どこかにとっておきます(後ほど、cpprefjp/imageリポジトリに登録してください)。

ツールのインストール

図の作成には、R(またはR言語と呼ばれる)というツールを使用します。

公式サイト: https://www.r-project.org/

各種環境向けにインストーラが提供されているので、公式サイトからダウンロードして、ご自分の環境にインストールしてください。

図の作成

Rは、GUIツールを使用しての図の作成はもちろん、Rスクリプトを使用してコマンドラインでも図を作成できます。
今回は、自動化のためにRスクリプトの方法を主に紹介します。

以下のRスクリプトを、「random_stats.R」という名前でファイルに保存してください。

# 乱数の分布クラスを使用した結果の出力を、図に変換するRスクリプト

# png形式で出力する
png("uniform_int_distribution.png")

# TSV形式になっている乱数の出力データを読み込む
x <- read.table("uniform_int_distribution.tsv")

# 1列目だけを抜き出す
value = x$V1

# 以下、データの特性に合わせて、ヒストグラムかプロットかを選択してください。

# ヒストグラムとして出力
# hist(value)

# プロットとして出力
plot(value)

出力する画像ファイル名と、入力のtsvファイル名を、分布クラスの名前に合わせて修正してください。
そして、コマンドラインで以下のコマンドを実行してください。

rscript random_stats.R

これで、png()関数で指定された画像ファイル名で、図が出力されます。
std::uniform_int_distributionクラスのサンプルコードでは、以下のような図が得られました。

この図は「プロット」と呼ばれる種類の図ですが、そのほか「ヒストグラム」等、いろいろな種類の図を出力できます。先ほどのrandom_stats.Rスクリプトに、ヒストグラムの図出力をコメントアウトしてあるので、分布クラスの特性に合わせて、図の種類を使い分けてください。

参考