2012年10月4日木曜日

情報の誤伝達2



import java.util.*;

class InfoDest {

public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int data = sc.nextInt();
int k = sc.nextInt(); //情報数(配列の長さ)
int n = sc.nextInt(); //試行回数
while(data>0){ calc(k,n); data--;}
}

static void calc(int k,int n) {
Random rand = new Random();
int[] a = new int[10];
//最初の値は全部0なのでこのままでいきます。
for(int i=0; i<n; i++){
for(int j=0; j<k; j++){
int r = rand.nextInt(3)-1;
a[j] = a[j] + r;
}
}

double avr=0; double var=0;
for(int i=0; i<k; i++){
System.out.print(a[i]+", ");
avr += Math.abs(a[i]);
var += a[i]*a[i];
}
System.out.printf("誤り距離平均: %.2f, 誤り分散: %.2f %n",avr/k,Math.sqrt(var));
}


}

てな感じでざっくり書いてみました。
入力としては、3つあって、
データ数 情報数(配列の長さ) 伝達回数 です。

試しに、
データ数を5, 情報数を5, 伝達回数を100とすると

5 5 100とすると、
3, 1, 2, -15, 4, 誤り距離平均: 5.00, 誤り分散: 15.97
23, 1, 0, 5, 14, 誤り距離平均: 8.60, 誤り分散: 27.40
7, 16, 5, 6, -8, 誤り距離平均: 8.40, 誤り分散: 20.74
-2, 12, 11, 6, 5, 誤り距離平均: 7.20, 誤り分散: 18.17
4, 7, 6, 3, -3, 誤り距離平均: 4.60, 誤り分散: 10.91

今回、rの値は-1,0,1で等確率としています。
ということは、伝達回数が多くなれば、『上手い具合に』元に戻りそうな気がします。
実際は戻ってないですね。

5 5 1000をしてみます。
-45, -4, 27, 10, 38, 誤り距離平均: 24.80, 誤り分散: 65.68
14, 5, -4, 18, 14, 誤り距離平均: 11.00, 誤り分散: 27.51
-21, -16, 41, -4, 50, 誤り距離平均: 26.40, 誤り分散: 69.96
-7, 47, 43, -6, -5, 誤り距離平均: 21.60, 誤り分散: 64.56
25, -19, -14, 18, 0, 誤り距離平均: 15.20, 誤り分散: 38.81

むう、やはり戻らないな。
5 5 10000だと、
-18, -9, 51, -64, -84, 誤り距離平均: 45.20, 誤り分散: 118.99
42, 30, -59, 240, -126, 誤り距離平均: 99.40, 誤り分散: 282.17
24, -22, -5, 25, 22, 誤り距離平均: 19.60, 誤り分散: 46.84
-28, -27, 8, 104, -101, 誤り距離平均: 53.60, 誤り分散: 150.31
-29, 125, -38, 90, 112, 誤り距離平均: 78.80, 誤り分散: 196.35



0 件のコメント:

コメントを投稿