shokosブログ

プログラミング

乱数を使用したアルゴリズムその2

前回ご紹介した、アルゴリズムイントロダクションにのっている、第5章の練習問題5.1-3に挑戦。
毎回、まず自力で考えてギブアップして、ヒントもらったり教えてもらったりして解いています。
がんばれわたし!
そして教えてくれる優しいお兄さんに感謝!

実はですね、この本すばらしいのですが、解答がないのです。モヒカンです。


【問題】
0と1をそれぞれ1/2の確率で出力する手続きを考えよう。
利用できるもの:1をp,0を(1-p)の確率で出力するBIASED-RANDOM。ただし0

package jp.ne.hatena.syoko_sasaki;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;

import org.junit.Test;

public class RandomManagerTest {

	// BIASED-RANDOM作成
	public static int biasedRandom(double p) {
		if (p <= 0 || p >= 1)
			throw new IllegalArgumentException("pの値がおかしいんじゃなイカ?");
		return Math.random() <= p ? 1 : 0;
	}

	@Test()
	public void biasedRandomTest() throws Exception {
		int per = 0;
		for (int i = 0; i < 1000; i++) {
			per += biasedRandom(0.3);
		}
		assertThat(per > 200 && per < 400, is(true));
	}

	@Test(expected = IllegalArgumentException.class)
	public void errorTest() throws Exception {
		biasedRandom(1.1);
		fail();
	}

}

続きは明日かなー。