ハミング距離を用いた近傍をランダムに生成するプログラム
import java.text.*; import java.math.BigDecimal;//四捨五入のため class HammingTest { // [1..x]乱数の生成 static int uniform(int x) { double dbl = ( ( (double)x - 1.0) * Math.random() ) + 1.0; BigDecimal bi = new BigDecimal(String.valueOf(dbl)); return (int)bi.setScale(0,BigDecimal.ROUND_HALF_UP).doubleValue(); } public static void main(String args[]) { int bit_line_before[] = {1,0,0,1,1,1,0,0}; //ビット列(x) int bit_line_after [] = {1,0,0,1,1,1,0,0}; //変換後ビット列(x') ネーミングが微妙 final int BIT_LINE_LENGTH = bit_line_before.length;//ビット列の長さ /* まずはハミング距離が1か2かをランダムに決める */ int hamming_distance = uniform(2); //ハミング距離 System.out.println("hamming_distance\t" + hamming_distance); /* 次にビット列の内どのビットを反転させるかを決める */ int bit_invert; //ビット反転する際の添字 /* ハミング距離が1の場合*/ if(hamming_distance == 1){ bit_invert = uniform(BIT_LINE_LENGTH); /* 反転処理のつもり(もう少しうまいやり方はないか?) */ //System.out.printf("bit_line_before[%d]\t%d\n", bit_invert - 1, bit_line_before[bit_invert - 1]); System.out.printf("ビット列の%d番目を反転\n", bit_invert - 1); if( bit_line_before[bit_invert - 1] == 1) bit_line_after[bit_invert - 1] = 0; else if( bit_line_before[bit_invert - 1] == 0) bit_line_after[bit_invert - 1] = 1; } /* ハミング距離が2の場合 */ int bit_invert_one = -1; //1ループ目の添字情報 if(hamming_distance == 2){ for(int i = 0; i < 2; i++){ bit_invert = uniform(BIT_LINE_LENGTH); //System.out.printf("bit_line_before[%d]\t%d\n", bit_invert - 1, bit_line_before[bit_invert - 1]); System.out.printf("ビット列の%d番目を反転\n", bit_invert - 1); if(bit_invert == bit_invert_one){ //1回目と同じ添字を選んでしまったため再チャレンジ System.err.print("deplicated error\n"); i = 0; //もう一回ループを回すため continue; }else{ if( bit_line_before[bit_invert - 1] == 1) bit_line_after[bit_invert - 1] = 0; else if( bit_line_before[bit_invert - 1] == 0) bit_line_after[bit_invert - 1] = 1; } bit_invert_one = bit_invert; } } //debug //before System.out.print("bit_line_before\t"); for(int i = 0; i < BIT_LINE_LENGTH; i++){ System.out.printf("%d ",bit_line_before[i]); } System.out.println(); //after System.out.print("bit_line_after\t"); for(int i = 0; i < BIT_LINE_LENGTH; i++){ System.out.printf("%d ",bit_line_after[i]); } System.out.println(); } } // end of class HammingTest()
一言
なんだかんだで2時間くらいかかってしまった。まぁすんなりできたからよしとしよう。
<2009/11/04追記>
自分でも分かっていたが汚いコードだとある人に言われた。
しかしあえて残しておく。
もっとコード書かなきゃー