random_func.hpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00012 #ifndef RANDOM_FUNC_HPP
00013 #define RANDOM_FUNC_HPP
00014
00015 #if defined(__APPLE__)
00016
00017 #define Random OTTD_Random
00018 #endif
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00036 struct Randomizer {
00038 uint32 state[2];
00039
00044 uint32 Next();
00045
00051 uint32 Next(uint32 max);
00052
00057 void SetSeed(uint32 seed);
00058 };
00059 extern Randomizer _random;
00060 extern Randomizer _interactive_random;
00061
00063 struct SavedRandomSeeds {
00064 Randomizer random;
00065 Randomizer interactive_random;
00066 };
00067
00071 static inline void SaveRandomSeeds(SavedRandomSeeds *storage)
00072 {
00073 storage->random = _random;
00074 storage->interactive_random = _interactive_random;
00075 }
00076
00080 static inline void RestoreRandomSeeds(const SavedRandomSeeds &storage)
00081 {
00082 _random = storage.random;
00083 _interactive_random = storage.interactive_random;
00084 }
00085
00086 void SetRandomSeed(uint32 seed);
00087 #ifdef RANDOM_DEBUG
00088 #ifdef __APPLE__
00089 #define OTTD_Random() DoRandom(__LINE__, __FILE__)
00090 #else
00091 #define Random() DoRandom(__LINE__, __FILE__)
00092 #endif
00093 uint32 DoRandom(int line, const char *file);
00094 #define RandomRange(max) DoRandomRange(max, __LINE__, __FILE__)
00095 uint32 DoRandomRange(uint32 max, int line, const char *file);
00096 #else
00097 static FORCEINLINE uint32 Random()
00098 {
00099 return _random.Next();
00100 }
00101
00102 static FORCEINLINE uint32 RandomRange(uint32 max)
00103 {
00104 return _random.Next(max);
00105 }
00106 #endif
00107
00108 static FORCEINLINE uint32 InteractiveRandom()
00109 {
00110 return _interactive_random.Next();
00111 }
00112
00113 static FORCEINLINE uint32 InteractiveRandomRange(uint32 max)
00114 {
00115 return _interactive_random.Next(max);
00116 }
00117
00133 static FORCEINLINE bool Chance16I(const uint a, const uint b, const uint32 r)
00134 {
00135 assert(b != 0);
00136 return (((uint16)r * b + b / 2) >> 16) < a;
00137 }
00138
00149 #ifdef RANDOM_DEBUG
00150 #define Chance16(a, b) Chance16I(a, b, DoRandom(__LINE__, __FILE__))
00151 #else
00152 static FORCEINLINE bool Chance16(const uint a, const uint b)
00153 {
00154 return Chance16I(a, b, Random());
00155 }
00156 #endif
00157
00173 #ifdef RANDOM_DEBUG
00174 #define Chance16R(a, b, r) (r = DoRandom(__LINE__, __FILE__), Chance16I(a, b, r))
00175 #else
00176 static FORCEINLINE bool Chance16R(const uint a, const uint b, uint32 &r)
00177 {
00178 r = Random();
00179 return Chance16I(a, b, r);
00180 }
00181 #endif
00182
00183 #endif