src/core/random_func.cpp
branchNewGRF_ports
changeset 6877 889301acc299
parent 6872 1c4a4a609f85
child 9869 6404afe43575
equal deleted inserted replaced
6876:2c40faeef7a5 6877:889301acc299
     4 
     4 
     5 #include "../stdafx.h"
     5 #include "../stdafx.h"
     6 #include "random_func.hpp"
     6 #include "random_func.hpp"
     7 #include "bitmath_func.hpp"
     7 #include "bitmath_func.hpp"
     8 
     8 
     9 uint32 _random_seeds[2][2];
     9 Randomizer _random, _interactive_random;
    10 
    10 
    11 uint32 InteractiveRandom()
    11 uint32 Randomizer::Next()
    12 {
    12 {
    13 	const uint32 s = _random_seeds[1][0];
    13 	const uint32 s = this->state[0];
    14 	const uint32 t = _random_seeds[1][1];
    14 	const uint32 t = this->state[1];
    15 
    15 
    16 	_random_seeds[1][0] = s + ROR(t ^ 0x1234567F, 7) + 1;
    16 	this->state[0] = s + ROR(t ^ 0x1234567F, 7) + 1;
    17 	return _random_seeds[1][1] = ROR(s, 3) - 1;
    17 	return this->state[1] = ROR(s, 3) - 1;
    18 }
    18 }
    19 
    19 
    20 uint InteractiveRandomRange(uint max)
    20 uint32 Randomizer::Next(uint16 max)
    21 {
    21 {
    22 	return GB(InteractiveRandom(), 0, 16) * max >> 16;
    22 	return GB(this->Next(), 0, 16) * max >> 16;
       
    23 }
       
    24 
       
    25 void Randomizer::SetSeed(uint32 seed)
       
    26 {
       
    27 	this->state[0] = seed;
       
    28 	this->state[1] = seed;
    23 }
    29 }
    24 
    30 
    25 #ifdef MERSENNE_TWISTER
    31 #ifdef MERSENNE_TWISTER
    26 // Source code for Mersenne Twister.
    32 // Source code for Mersenne Twister.
    27 // A Random number generator with much higher quality random numbers.
    33 // A Random number generator with much higher quality random numbers.
   117 }
   123 }
   118 
   124 
   119 #else /* MERSENNE_TWISTER */
   125 #else /* MERSENNE_TWISTER */
   120 void SetRandomSeed(uint32 seed)
   126 void SetRandomSeed(uint32 seed)
   121 {
   127 {
   122 	_random_seeds[0][0] = seed;
   128 	_random.SetSeed(seed);
   123 	_random_seeds[0][1] = seed;
   129 	_interactive_random.SetSeed(seed * 0x1234567);
   124 	_random_seeds[1][0] = seed * 0x1234567;
       
   125 	_random_seeds[1][1] = _random_seeds[1][0];
       
   126 }
   130 }
   127 
   131 
   128 #ifdef RANDOM_DEBUG
   132 #ifdef RANDOM_DEBUG
   129 #include "../network/network_data.h"
   133 #include "../network/network_data.h"
       
   134 #include "../variables.h" /* _frame_counter */
       
   135 #include "../player_func.h"
       
   136 
   130 uint32 DoRandom(int line, const char *file)
   137 uint32 DoRandom(int line, const char *file)
   131 {
   138 {
   132 	if (_networking && (DEREF_CLIENT(0)->status != STATUS_INACTIVE || !_network_server))
   139 	if (_networking && (DEREF_CLIENT(0)->status != STATUS_INACTIVE || !_network_server)) {
   133 		printf("Random [%d/%d] %s:%d\n",_frame_counter, (byte)_current_player, file, line);
   140 		printf("Random [%d/%d] %s:%d\n",_frame_counter, (byte)_current_player, file, line);
   134 #else /* RANDOM_DEBUG */
   141 	}
   135 uint32 Random()
   142 
   136 {
   143 	return _random.Next();
       
   144 }
   137 #endif /* RANDOM_DEBUG */
   145 #endif /* RANDOM_DEBUG */
   138 	const uint32 s = _random_seeds[0][0];
       
   139 	const uint32 t = _random_seeds[0][1];
       
   140 
       
   141 	_random_seeds[0][0] = s + ROR(t ^ 0x1234567F, 7) + 1;
       
   142 	return _random_seeds[0][1] = ROR(s, 3) - 1;
       
   143 }
       
   144 #endif /* MERSENNE_TWISTER */
   146 #endif /* MERSENNE_TWISTER */
   145 
   147 
   146 #if defined(RANDOM_DEBUG) && !defined(MERSENNE_TWISTER)
   148 #if defined(RANDOM_DEBUG) && !defined(MERSENNE_TWISTER)
   147 uint DoRandomRange(uint max, int line, const char *file)
   149 uint DoRandomRange(uint max, int line, const char *file)
   148 {
   150 {
   149 	return GB(DoRandom(line, file), 0, 16) * max >> 16;
   151 	return GB(DoRandom(line, file), 0, 16) * max >> 16;
   150 }
   152 }
   151 #else /* RANDOM_DEBUG & !MERSENNE_TWISTER */
       
   152 uint RandomRange(uint max)
       
   153 {
       
   154 	return GB(Random(), 0, 16) * max >> 16;
       
   155 }
       
   156 #endif /* RANDOM_DEBUG & !MERSENNE_TWISTER */
   153 #endif /* RANDOM_DEBUG & !MERSENNE_TWISTER */