MGL::Random::XorShift
Contents
MGL::Random::XorShift#
概要#
XorShiftクラスはXorShiftアルゴリズムによる32bit乱数ジェネレータです。高速で再現性があり、周期が2の32乗-1という特徴があります。
宣言#
namespace MGL::Random
{
class XorShift;
}
メンバ情報#
種類 |
名前 |
内容 |
---|---|---|
関数 |
||
関数 |
乱数の取得 |
|
関数 |
乱数を浮動小数点数で取得 |
|
関数 |
現在のシード値を取得 |
|
関数 |
シード値を設定 |
コンストラクタ#
宣言#
constexpr XorShift(uint32_t seed = 0) noexcept
引数#
- uint32_t seed
シード値を指定します。省略時は0が指定されます。
説明#
32bitのシード値を指定して乱数ジェネレータを初期化します。
利用例#
// シード値を指定して初期化
MGL::Random::XorShift random1(0x12345678);
// 引数を指定しなかった場合はシード値0で初期化
MGL::Random::XorShift random2;
// STLのrandom_deviceを用いて予測不可能なシード値で初期化
std::random_device rd;
MGL::Random::XorShift random3(rd());
Get#
32bitの乱数を生成して取得します。
宣言#
constexpr uint32_t Get() noexcept
戻り値#
- uint32_t
生成された乱数が返ります。
説明#
現在のシード値を元に乱数を生成し、その値を返します。生成された乱数は次の生成のためのシード値として設定されます。
利用例#
// シード値を指定して初期化
MGL::Random::XorShift random(0x12345678);
// 乱数を取得
auto randomValue = random.Get(); // randomValue = 0から0xFFFFFFFFの間の値
GetFloat#
浮動小数点数の乱数を生成して取得します。
宣言#
constexpr float GetFloat() noexcept
戻り値#
- float
生成された乱数が返ります。
説明#
0.0fから1.0fの浮動小数点数をランダムに生成し、その値を返します。
この関数はまず32bitで生成し、その値を0xFFFFFFFFで割った値を返します。Getと同様に、途中で生成された32bitの乱数を次のシード値として使用します。
利用例#
// シード値を指定して初期化
MGL::Random::XorShift random(0x12345678);
// 乱数を浮動小数点数で取得
auto randomValue = random.GetFloat(); // randomValue = 0.0fから1.0fの間の値
GetSeed#
現在のシード値を取得します。
宣言#
constexpr uint32_t GetSeed() const noexcept
戻り値#
- uint32_t
現在のシード値。
説明#
現在設定されているシード値を取得するための関数です。ここで返される値は、前回の32bit乱数の生成結果と同じ値になります。
利用例#
// シード値を指定して初期化
MGL::Random::XorShift random(0x12345678);
// シード値を取得
auto seed1 = random.GetSeed(); // まだ乱数を生成していないので、seed1 == 0x12345678になる
// 一度乱数を生成
auto randomValue = random.Get();
// 再度シード値を取得
auto seed2 = random.GetSeed(); // 前回生成した乱数がシード値になるため、seed2 == randomValueになる
SetSeed#
現在のシード値を設定します。
宣言#
constexpr void SetSeed(uint32_t seed) noexcept
引数#
- uint32_t seed
設定するシード値を指定します。
説明#
次の乱数生成に利用するシード値を設定します。シード値は乱数生成時に更新されるため、主に乱数パターンを再現する際に利用します。
利用例#
// STLのrandom_deviceを用いて予測不可能なシード値で初期化
std::random_device rd;
MGL::Random::XorShift random(rd());
// シード値を一旦保持
auto seed = random.GetSeed();
// 10回乱数を生成して表示
for (int i = 0; i < 10; i++)
{
printf("%d\n", random.Get()); // ランダムな値が10個表示される ... (1)
}
// シード値を再設定
random.SetSeed(seed);
// 10回乱数を生成して表示
for (int i = 0; i < 10; i++)
{
printf("%d\n", random.Get()); // シード値が同様であるため、(1)と同じパターンで表示される
}