/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: Random.java,v 1.1 2005/05/11 17:46:59 rampil Exp $
 */
package org.logical_paradox.common.lang;

/**
 * 乱数ジェネレータ
 * 普通に使うために最低限必要な機能のみを実装したもの
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.1 $
 */
public class Random {
	/** 範囲指定 - 正負両方 */
	public static final int BOTH = 0;
	/** 範囲指定 - 負の数または0 */
	public static final int MINUS_OR_ZERO = -1;
	/** 範囲指定 - 正の数または0 */
	public static final int PLUS_OR_ZERO = 1;

	/** 乱数ジェネレータ */
	private final java.util.Random r;

	/** このインスタンスに対して設定されている返却値範囲モード */
	private int rangeType = BOTH;

	/**
	 * コンストラクタ
	 * 正負両方の数を返す
	 * @param seed 乱数シード
	 */
	public Random(long seed) {
		r = new java.util.Random(seed);
	}
	/**
	 * コンストラクタ
	 * @param seed 乱数シード
	 * @param mode 返却値モード
	 */
	public Random(long seed, int mode) {
		this(seed);
		rangeType = mode;
	}
	/**
	 * コンストラクタ
	 * ランダムシードは現在時刻が採用される
	 * @param mode 返却値モード
	 */
	public Random(int mode) {
		this();
		rangeType = mode;
	}
	/**
	 * コンストラクタ
	 * ランダムシードは現在時刻が採用される<br>
	 * 返す値は正負両方の数を返す
	 */
	public Random() {
		r = new java.util.Random(System.currentTimeMillis());
	}
	/**
	 * 整数を返す
	 * @return 生成された整数
	 */
	public int nextInt() {
		int n = r.nextInt();

		switch(getRangeType()) {
			// 正負両方
			case BOTH:
				break;
			// 負の数または0
			case MINUS_OR_ZERO:
				if(n > 0) {
					n *= -1;
				}
				break;
			// 正の数または0
			case PLUS_OR_ZERO:
				if(n < 0) {
					n *= -1;
				}
				break;
			default:
				throw new IllegalArgumentException();
		}

		return n;
	}
	/**
	 * この乱数ジェネレータが返す値の範囲を返す
	 * @return 範囲
	 */
	public int getRangeType() {
		return rangeType;
	}
}
