MGL::Random::XorShift#

概要#

XorShiftクラスはXorShiftアルゴリズムによる32bit乱数ジェネレータです。高速で再現性があり、周期が2の32乗-1という特徴があります。

宣言#

namespace MGL::Random
{
    class XorShift;
}

メンバ情報#

種類

名前

内容

関数

コンストラクタ

関数

Get

乱数の取得

関数

GetFloat

乱数を浮動小数点数で取得

関数

GetSeed

現在のシード値を取得

関数

SetSeed

シード値を設定


コンストラクタ#

宣言#

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)と同じパターンで表示される
}