random.cpp 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. // Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
  2. // For more information, see LICENCE in the main folder
  3. #include "random.hpp"
  4. #include <random>
  5. std::mt19937 generator;
  6. std::uniform_int_distribution<int32> int31_distribution;
  7. std::uniform_int_distribution<uint32> uint32_distribution;
  8. /// Initializes the random number generator
  9. void rnd_init( void ){
  10. std::random_device device;
  11. generator = std::mt19937( device() );
  12. int31_distribution = std::uniform_int_distribution<int32>( 0, SINT32_MAX );
  13. uint32_distribution = std::uniform_int_distribution<uint32>( 0, UINT32_MAX );
  14. }
  15. /// Generates a random number in the interval [0, SINT32_MAX]
  16. int32 rnd( void ){
  17. return int31_distribution( generator );
  18. }
  19. /// Generates a random number in the interval [0, UINT32_MAX]
  20. uint32 rnd_uint32( void ){
  21. return uint32_distribution( generator );
  22. }
  23. /// Generates a random number in the interval [0.0, 1.0)
  24. /// NOTE: interval is open ended, so 1.0 is excluded
  25. double rnd_uniform( void ){
  26. return rnd_uint32() * ( 1.0 / 4294967296.0 );// divided by 2^32
  27. }
  28. /// Generates a random number in the interval [min, max]
  29. /// Returns min if range is invalid.
  30. int32 rnd_value( int32 min, int32 max ){
  31. if( min >= max ){
  32. return min;
  33. }
  34. return min + (int32)( rnd_uniform() * ( max - min + 1 ) );
  35. }