00001 //------------------------------------------------------------------------------ 00002 // Lamp : Open source game middleware 00003 // Copyright (C) 2004 Junpei Ohtani ( Email : junpee@users.sourceforge.jp ) 00004 // 00005 // This library is free software; you can redistribute it and/or 00006 // modify it under the terms of the GNU Lesser General Public 00007 // License as published by the Free Software Foundation; either 00008 // version 2.1 of the License, or (at your option) any later version. 00009 // 00010 // This library is distributed in the hope that it will be useful, 00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 // Lesser General Public License for more details. 00014 // 00015 // You should have received a copy of the GNU Lesser General Public 00016 // License along with this library; if not, write to the Free Software 00017 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00018 //------------------------------------------------------------------------------ 00019 00020 /** @file 00021 * ランダムヘッダ 00022 * @author Junpee 00023 */ 00024 00025 #ifndef RANDOM_H_ 00026 #define RANDOM_H_ 00027 00028 namespace Lamp{ 00029 00030 //------------------------------------------------------------------------------ 00031 /** 00032 * ランダム 00033 * 00034 * このクラスは継承しないで下さい。 00035 */ 00036 class Random{ 00037 public: 00038 /** 00039 * コンストラクタ 00040 * @param initialSeed 初期化種 00041 */ 00042 explicit Random(u_int initialSeed = 1){ setSeed(initialSeed); } 00043 00044 /** 00045 * 種の設定 00046 * @param seed 設定する種 00047 */ 00048 void setSeed(u_int seed){ seed_ = seed; } 00049 00050 /** 00051 * ランダム値の取得 00052 * @return 0以上、Random::max以下のランダム値。 00053 */ 00054 inline u_int get(){ 00055 seed_ = 1664525 * seed_ + 1013904223; 00056 return seed_; 00057 } 00058 00059 /** 00060 * byteランダム値の取得 00061 * @return 0以上、255以下のランダム値 00062 */ 00063 inline int getByte(){ 00064 return (get() & 0xff); 00065 } 00066 00067 /** 00068 * floatランダム値の取得 00069 * @return -1.f以上、1.f未満のランダム値を返す 00070 */ 00071 inline float getSignedFloat(){ 00072 float result; 00073 (*(u_int*)&result) = 0x3f800000 | (0x7fffff & get()); 00074 return (result * 2.f) - 3.f; 00075 } 00076 00077 /** 00078 * unsigned floatランダム値の取得 00079 * @return 0.f以上、1.f未満のランダム値を返す 00080 */ 00081 inline float getUnsignedFloat(){ 00082 float result; 00083 (*(u_int*)&result) = 0x3f800000 | (0x7fffff & get()); 00084 return result - 1.0f; 00085 } 00086 00087 private: 00088 // コピーコンストラクタの隠蔽 00089 Random(const Random& copy); 00090 00091 // 代入コピーの隠蔽 00092 void operator =(const Random& copy); 00093 00094 // ランダムの種 00095 u_int seed_; 00096 }; 00097 00098 //------------------------------------------------------------------------------ 00099 } // End of namespace Lamp 00100 #endif // End of RANDOM_H_ 00101 //------------------------------------------------------------------------------