PG日誌

受託系 PG が C# の事を書いています

C++で乱数を取得する時に短時間にsrandを何度も呼ばない

すいません、当たり前の話です。以下コーディングミスで10分ほど悩んだので備忘録です。

C++で乱数を取得するときにrand関数を使いますが、毎回乱数が生成されないためにsrand関数でシードを更新しましょう。という話があったのでこんなコードを書いてみました。

// 画面をタップしたときのイベントハンドラ
listner->onTouchBegan = [this](Touch* touch, Event* event)
{
    srand((unsigned int)time(nullptr));
    CCLOG("rans() = %d", rand() % 10000);
}

で、これを実行して画面を何回かタップするとログにこんな感じで出力がされました。

rand() = 2661

rand() = 2661

rand() = 2661

rand() = 2672

rand() = 2672

rand() = 2672

・・・・あれ?乱数出ない?というか、乱数ですらない同じ数値なんだけど…?と思ったのですが、推したときにCallしてるこの行、、、

   srand((unsigned int)time(nullptr)); // ん??

これは、ただの間抜けですね。

短い間隔で画面をタップしたときは同じシードでsrandしてまた乱数が最初からになって同じ事になっていました。

正しくは、

bool HelloWorld::init()
{
    srand((unsigned int)time(nullptr));

    // 画面をタップしたときのイベントハンドラ
    listner->onTouchBegan = [this](Touch* touch, Event* event)
    {
        //srand((unsigned int)time(nullptr)); // ここではない
        CCLOG("rans() = %d", rand() % 10000);
    }
}

で、

『毎回乱数シードをsrandで初期化してはいけない』でした。ただのマヌケですね。

さいごに

Cocos2d-x使うなら標準で乱数を作る関数のサポートがあったという話です。そもそも悩む必要が無かったらしい。

takachan.hatenablog.com