読者です 読者をやめる 読者になる 読者になる

ハミング距離を用いた近傍をランダムに生成するプログラム

講義
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追記>

自分でも分かっていたが汚いコードだとある人に言われた。
しかしあえて残しておく。
もっとコード書かなきゃー