summaryrefslogtreecommitdiff
path: root/src/macros.h
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2007-11-17 23:16:41 +0000
committerrubidium <rubidium@openttd.org>2007-11-17 23:16:41 +0000
commit80a7a917308a1cd422923e953ced86d66503906f (patch)
tree6875b2043f6f455b0745dccacf6c5c4897db8dfb /src/macros.h
parent32202be4528f18fbe7eaa03bf2585f5fd8179882 (diff)
downloadopenttd-80a7a917308a1cd422923e953ced86d66503906f.tar.xz
(svn r11454) -Fix: the CHANCE16 functions were biased; a 32768 in 65536 chance was really a 32769 in 65536 chance.
Diffstat (limited to 'src/macros.h')
-rw-r--r--src/macros.h15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/macros.h b/src/macros.h
index 95af44123..cb2839c90 100644
--- a/src/macros.h
+++ b/src/macros.h
@@ -476,7 +476,7 @@ template<typename T> static inline bool IS_INSIDE_1D(const T x, const int base,
* @param b The denominator of the fraction, must of course not be null
* @return True in (a/b) percent
*/
-#define CHANCE16(a, b) ((uint16)Random() <= (uint16)((65536 * (a)) / (b)))
+#define CHANCE16(a, b) CHANCE16I(a, b, Random())
/**
* Flips a coin with a given probability and saves the randomize-number in a variable.
@@ -484,18 +484,25 @@ template<typename T> static inline bool IS_INSIDE_1D(const T x, const int base,
* This macro uses the same parameters as the CHANCE16 marco. The third parameter
* must be a variable the randomize-number from Random() is saved in.
*
+ * The low 16 bits of r will already be used and can therefor not be passed to
+ * CHANCE16I. One can only send the high 16 bits to CHANCE16I.
+ *
* @param a The numerator of the fraction, see CHANCE16
* @param b The denominator of the fraction, see CHANCE16
* @param r The variable to save the randomize-number from Random()
* @return True in (a/b) percent
*/
-#define CHANCE16R(a, b, r) ((uint16)(r = Random()) <= (uint16)((65536 * (a)) / (b)))
+#define CHANCE16R(a, b, r) CHANCE16I(a, b, r = Random())
/**
* Checks if a given randomize-number is below a given probability.
*
* This macro is used to check if the given probability by the fraction of (a/b)
- * is greater than the given randomize-number v.
+ * is greater than low 16 bits of the given randomize-number v.
+ *
+ * Do not use this function twice on the same random 16 bits as it will yield
+ * the same result. One can use a random number for two calls to CHANCE16I,
+ * where one call sends the low 16 bits and the other the high 16 bits.
*
* @param a The numerator of the fraction, see CHANCE16
* @param b The denominator of the fraction, see CHANCE16
@@ -504,7 +511,7 @@ template<typename T> static inline bool IS_INSIDE_1D(const T x, const int base,
*/
static inline bool CHANCE16I(const uint a, const uint b, const uint32 r)
{
- return (uint16)r <= (uint16)((65536 * a) / b);
+ return (uint16)r < (uint16)((65536 * a) / b);
}