- ベストアンサー
二元対称無記憶通信路を実現するプログラム
C言語を用いて、 x→ 0 or 1 y→ 0 or 1 P(y=0|x=1) = P(y=1|x=0) = p P(y=0|x=0) = P(y=1|x=1) = 1-p を各ビット独立に達成する、プログラムを組みたいと思っています。 具体的にはNビットの 0 or 1 の系列を発生させて、 上記の確率で各ビットを独立に反転させたNビットの 0 or 1 の系列を得たいと思っています。 ですが、どう組めばよいか分かりません・・・ どなたかアドバイス、参考となるサイトを教えていただけないでしょうか・・・
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
懐かしい響き const double p = 0.01; // 誤り率 const int N = 10000; // ビット列の長さ int x[N]; // 送信ビット列 int y[N]; // 受信ビット列 int rand_bin(); // 1 ビットの乱数を返す関数 double rand_real(); // [0,1] の一様乱数を返す関数 int main() { int i; // 送信ビット列の生成 for (i=0 ; i<N ; i++) { x[i] = rand_bin(); } // 受信ビット列の計算 for (i=0 ; i<N ; i++) { if (rand_real() < p) { // 一定の確率で y[i] = !x[i]; // 誤り発生! } else { y[i] = x[i]; } } // 後は、お好みで。 return 0; } *注意* インデントのために、全角スペースを使っています。 rand_bin と rand_real は別途定義してください。
その他の回答 (1)
- osamuy
- ベストアンサー率42% (1231/2878)
・bit演算の知識。 ・確率を表現するためのMathライブラリ関数についての知識。 ・データ入出力の知識。 ・Cの制御構造/基本文法についての知識。 ――上記について不明点がどこにあるかを補足したほうが、回答が得られやすいかと。 たとえばbit演算できなくても、数字1文字「0」「1」の読み書きするプログラムをかけるならなんとかなりますし。
お礼
ご回答ありがとうございました! 今後質問するときの参考にさせていただきます!!
お礼
ご回答ありがとうございます! ソースものせていただき、たすかりました! 「 if (rand_real() < p) { 」 この発想を思いつかなかったなかったです;; ありがとうございます!