OpenTTD Source  20241108-master-g80f628063a
random_func.hpp File Reference

Pseudo random number generator. More...

Go to the source code of this file.

Data Structures

struct  Randomizer
 Structure to encapsulate the pseudo random number generators. More...
 
struct  SavedRandomSeeds
 Stores the state of all random number generators. More...
 

Functions

static constexpr uint32_t ScaleToLimit (uint32_t value, uint32_t limit)
 Scale a uint32_t number to be within the range [0,limit). More...
 
void SaveRandomSeeds (SavedRandomSeeds *storage)
 Saves the current seeds. More...
 
void RestoreRandomSeeds (const SavedRandomSeeds &storage)
 Restores previously saved seeds. More...
 
void SetRandomSeed (uint32_t seed)
 (Re)set the state of the random number generators. More...
 
uint32_t Random ([[maybe_unused]] const std::source_location location=std::source_location::current())
 
uint32_t RandomRange (uint32_t limit, const std::source_location location=std::source_location::current())
 Pick a random number between 0 and limit - 1, inclusive. More...
 
uint32_t InteractiveRandom ()
 
uint32_t InteractiveRandomRange (uint32_t limit)
 
bool Chance16I (const uint32_t a, const uint32_t b, const uint32_t r)
 Checks if a given randomize-number is below a given probability. More...
 
bool Chance16 (const uint32_t a, const uint32_t b, const std::source_location location=std::source_location::current())
 Flips a coin with given probability. More...
 
bool Chance16R (const uint32_t a, const uint32_t b, uint32_t &r, const std::source_location location=std::source_location::current())
 Flips a coin with a given probability and saves the randomize-number in a variable. More...
 
void RandomBytesWithFallback (std::span< uint8_t > buf)
 Fill the given buffer with random bytes. More...
 

Variables

Randomizer _random
 Random used in the game state calculations.
 
Randomizer _interactive_random
 Random used everywhere else, where it does not (directly) influence the game state.
 

Detailed Description

Pseudo random number generator.

Definition in file random_func.hpp.

Function Documentation

◆ Chance16()

bool Chance16 ( const uint32_t  a,
const uint32_t  b,
const std::source_location  location = std::source_location::current() 
)
inline

Flips a coin with given probability.

This function returns true with (a/b) probability.

See also
Chance16I()
Parameters
aThe nominator of the fraction
bThe denominator of the fraction
Returns
True with (a/b) probability

Definition at line 134 of file random_func.hpp.

References Chance16I().

Referenced by Disaster_Helicopter_Init(), DisasterTick_Submarine(), FindSubsidyCargoDestination(), IsRoadAllowedHere(), SetupFarmFieldFence(), and TownActionBribe().

◆ Chance16I()

bool Chance16I ( const uint32_t  a,
const uint32_t  b,
const uint32_t  r 
)
inline

Checks if a given randomize-number is below a given probability.

This function is used to check if the given probability by the fraction of (a/b) is greater than low 16 bits of the given randomize-number r.

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.

Parameters
aThe numerator of the fraction
bThe denominator of the fraction, must of course not be null
rThe given randomize-number
Returns
True if the probability given by r is less or equal to (a/b)

Definition at line 118 of file random_func.hpp.

Referenced by Chance16().

◆ Chance16R()

bool Chance16R ( const uint32_t  a,
const uint32_t  b,
uint32_t &  r,
const std::source_location  location = std::source_location::current() 
)
inline

Flips a coin with a given probability and saves the randomize-number in a variable.

This function uses the same parameters as Chance16. 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 therefore not be passed to Chance16I. One can only send the high 16 bits to Chance16I.

See also
Chance16I()
Parameters
aThe numerator of the fraction
bThe denominator of the fraction
rThe variable to save the randomize-number from Random()
Returns
True in (a/b) percent

Definition at line 154 of file random_func.hpp.

Referenced by AmbientSoundEffectCallback(), HandleCrashedAircraft(), and HandleCrashedTrain().

◆ RandomBytesWithFallback()

void RandomBytesWithFallback ( std::span< uint8_t >  buf)

Fill the given buffer with random bytes.

This function will attempt to use a cryptographically-strong random generator, but will fall back to a weaker random generator if none is available.

In the end, the buffer will always be filled with some form of random bytes when this function returns.

Parameters
bufThe buffer to fill with random bytes.

Definition at line 95 of file random_func.cpp.

References Debug.

Referenced by X25519SecretKey::CreateRandom(), X25519Nonce::CreateRandom(), GenerateUid(), and X25519AuthenticationHandler::SendResponse().

◆ RandomRange()

uint32_t RandomRange ( uint32_t  limit,
const std::source_location  location = std::source_location::current() 
)
inline

Pick a random number between 0 and limit - 1, inclusive.

That means 0 can be returned and limit - 1 can be returned, but limit can not be returned.

Parameters
limitLimit for the range to be picked from.
Returns
A random number in [0,limit).

Definition at line 88 of file random_func.hpp.

References ScaleToLimit().

Referenced by Vehicle::Crash(), FindSubsidyIndustryCargoRoute(), FindSubsidyPassengerRoute(), Industry::GetRandom(), Town::GetRandom(), CYapfFollowShipT< Types >::GetRandomTrackdir(), FlowStat::GetVia(), FlowStat::GetViaWithRestricted(), GrowTownWithBridge(), RandomDiagDir(), RandomHeight(), IndustryBuildData::SetupTargetCount(), StationCargoList::Truncate(), and IndustryBuildData::TryBuildNewIndustry().

◆ RestoreRandomSeeds()

void RestoreRandomSeeds ( const SavedRandomSeeds storage)
inline

Restores previously saved seeds.

Parameters
storageStorage where SaveRandomSeeds() stored th seeds

Definition at line 65 of file random_func.hpp.

References _interactive_random, and _random.

Referenced by CmdAutoreplaceVehicle().

◆ SaveRandomSeeds()

void SaveRandomSeeds ( SavedRandomSeeds storage)
inline

Saves the current seeds.

Parameters
storageStorage for saving

Definition at line 55 of file random_func.hpp.

References _interactive_random, and _random.

Referenced by CmdAutoreplaceVehicle(), and StartupOneEngine().

◆ ScaleToLimit()

static constexpr uint32_t ScaleToLimit ( uint32_t  value,
uint32_t  limit 
)
staticconstexpr

Scale a uint32_t number to be within the range [0,limit).

Parameters
valueThe value to scale.
limitThe limit to scale to.
Returns
The scaled value.

Definition at line 19 of file random_func.hpp.

Referenced by Randomizer::Next(), and RandomRange().

◆ SetRandomSeed()

void SetRandomSeed ( uint32_t  seed)

(Re)set the state of the random number generators.

Parameters
seedthe new state

Definition at line 66 of file random_func.cpp.

References _interactive_random, _random, and Randomizer::SetSeed().

Referenced by StartupOneEngine().