//------------------------------------------------------------------------------
// Lamp : Open source game middleware
// Copyright (C) 2004  Junpei Ohtani ( Email : junpee@users.sourceforge.jp )
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//------------------------------------------------------------------------------

/** @file
 * ランダムヘッダ
 * @author Junpee
 */

#ifndef RANDOM_H_
#define RANDOM_H_

namespace Lamp{

//------------------------------------------------------------------------------
/**
 * ランダム
 *
 * このクラスは継承しないで下さい。
 */
class Random{
public:
	/**
	 * コンストラクタ
	 * @param initialSeed 初期化種
	 */
	explicit Random(u_int initialSeed = 1){ setSeed(initialSeed); }

	/**
	 * 種の設定
	 * @param seed 設定する種
	 */
	void setSeed(u_int seed){ seed_ = seed; }

	/**
	 * ランダム値の取得
	 * @return 0以上、Random::max以下のランダム値。
	 */
	inline u_int get(){
		seed_ = 1664525 * seed_ + 1013904223;
		return seed_;
	}

	/**
	 * byteランダム値の取得
	 * @return 0以上、255以下のランダム値
	 */
	inline int getByte(){
		return (get() & 0xff);
	}

	/**
	 * floatランダム値の取得
	 * @return -1.f以上、1.f未満のランダム値を返す
	 */
	inline float getSignedFloat(){
		float result;
		(*(u_int*)&result) = 0x3f800000 | (0x7fffff & get());
		return (result * 2.f) - 3.f;
	}

	/**
	 * unsigned floatランダム値の取得
	 * @return 0.f以上、1.f未満のランダム値を返す
	 */
	inline float getUnsignedFloat(){
		float result;
		(*(u_int*)&result) = 0x3f800000 | (0x7fffff & get());
		return result - 1.0f;
	}

private:
	// コピーコンストラクタの隠蔽
	Random(const Random& copy);

	// 代入コピーの隠蔽
	void operator =(const Random& copy);

	// ランダムの種
	u_int seed_;
};

//------------------------------------------------------------------------------
} // End of namespace Lamp
#endif // End of RANDOM_H_
//------------------------------------------------------------------------------
