• ベストアンサー

二元対称無記憶通信路を実現するプログラム

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 の系列を得たいと思っています。 ですが、どう組めばよいか分かりません・・・ どなたかアドバイス、参考となるサイトを教えていただけないでしょうか・・・

質問者が選んだベストアンサー

  • ベストアンサー
noname#137556
noname#137556
回答No.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 は別途定義してください。

miyu6666
質問者

お礼

ご回答ありがとうございます! ソースものせていただき、たすかりました! 「 if (rand_real() < p) { 」 この発想を思いつかなかったなかったです;; ありがとうございます!

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

・bit演算の知識。 ・確率を表現するためのMathライブラリ関数についての知識。 ・データ入出力の知識。 ・Cの制御構造/基本文法についての知識。 ――上記について不明点がどこにあるかを補足したほうが、回答が得られやすいかと。 たとえばbit演算できなくても、数字1文字「0」「1」の読み書きするプログラムをかけるならなんとかなりますし。

miyu6666
質問者

お礼

ご回答ありがとうございました! 今後質問するときの参考にさせていただきます!!

関連するQ&A

専門家に質問してみよう