【MATLAB】通信の勉強をする前の練習問題【問題編①乱数の生成】


更新履歴:2018/9/6 問題(1),(2),(3),(4)作成

【1章】乱数の生成

通信のシミュレーションで発生させる乱数のほとんどは「{0,1}の一様分布」か「平均0の正規分布」です。今回はそれらの乱数を生成することに焦点をあてて練習していきましょう。
ただし、1章ではfor文を使うことは禁止とします。MATLABはfor文で入れれば入れるほど実行速度は遅くなってしまいます。いまのうちからできるだけfor文を使わないように工夫する練習をしましょう。できる限り行列計算で済ませるのがスマートといえます。

(1)正規分布に従う乱数の生成する

平均$\mu$、標準偏差$\sigma$にの正規分布に従う乱数を生成しましょう。ライセンスを使えば「normrnd($\mu,\sigma$,size)」という形式で一瞬でできるのですが、今回はrandn()という標準正規分布(=平均0、標準偏差1の正規分布)に従う乱数を生成する関数を使ってみましょう。

ヒント

${\rm X}$が標準正規分布に従う乱数であるとすると、${a{\rm X} + b}$は平均$b$、標準偏差$a$の正規分布に従う乱数となります。
https://jp.mathworks.com/help/matlab/ref/randn.html?

(2)生成した乱数のヒストグラムを表示する

問題(1)の方法で$N$個の乱数を生成し、そのヒストグラムを表示してたしかに乱数たちが正規分布に従っていることを確認しましょう。乱数の数を増やすと正確にその分布に近づくこと(大数の法則)も併せて確認しましょう。

ヒント

(3)生成した乱数たちの分散を計算する

問題(1)で生成した乱数はうまくいっていれば分散$\sigma^2$になっているはずですが、それが果たして正しいかを「生成した乱数から」計算してみましょう。すなわち、問題(1)で生成した乱数の真の分散は未知であるとして、それを乱数列から逆に求めてみましょう。

ヒント

${\rm V} = {\rm E}[{\rm X}^2] - ({\rm E}[{\rm X}])^2$

(4)ビット列の生成

次はビット列を生成してみましょう。
ビットたちは、相互情報量を最大にするために0と1が1/2の確率で出るように、ランダムに発生するはずです。randi([a,b])関数を使えばa以上b以下の整数をランダムに生成することができます。これを使って2行$N$列のビット列を生成してみましょう。

解答

%おまじない
clear all

%問(1) 正規分布の生成
N = 10^5;
sigma = 2;
mu = 3;

value = randn(1,N);
value = sigma * value + mu;

%問(2) 生成した乱数のヒストグラム
histogram(value,100)

%問(3) 生成した乱数の分散
disp(value(1,:)*value(1,:)'/N - sum(value(1,:)/N)^2)

%問(4) ビット列の生成
TX_bit = randi([0,1],2,N);