0

奇妙なテスト動作。ランダムな値を生成するクラスがあります。

std::random_device RandomProvider::rd;
std::mt19937 RandomProvider::rnb(RandomProvider::rd());
    #define mainDataType unsigned int

mainDataType RandomProvider::GetNextValue(mainDataType upperLimit)
{
    static std::uniform_int_distribution<int> uniform_dist(1, upperLimit);
    return uniform_dist(rnb);
}

そして、その動作をテストする単体テスト。

    TEST_METHOD(TestRandomNumber)
    {
        CreateOper(RandomNumber);
        int one = 0, two = 0, three = 0, unlim = 0;
        const int cycles = 10000;

        for (int i = 0; i < cycles; i++)
        {
            mainDataType res = RandomProvider::GetNextValue(3);
            if (res == 1) one++;
            if (res == 2) two++;
            if (res == 3) three++;
        }

        double onePerc = one / (double)cycles;
        double twoPerc = two / (double)cycles;
        double threePerc = three / (double)cycles;

        Assert::IsTrue(onePerc > 0.20 && onePerc < 0.40);
        Assert::IsTrue(twoPerc > 0.20 && twoPerc < 0.40);
        Assert::IsTrue(threePerc > 0.20 && threePerc < 0.40);
    }

テストはデバッグで常に合格し、それを選択して実行した場合はそれのみを実行します。しかし、他のテストで実行すると常に失敗します。デバッグ出力をテキスト ファイルに追加したところ、onePerc = 0.0556、twoPerc = 0.0474、threePerc = 0.0526 という非現実的な値が得られました。(私はVS2013 RCを使用しています)

4

1 に答える 1

1

uniform_int_distribution最初に呼び出すときに静的を使用するためGetNextValue、最大制限が設定され、その後の呼び出しで変更されることはありません。おそらく、あなたが言及したテストケースでは、 への最初の呼び出しは とGetNextValueは異なる値を持っていました3。返された値から判断すると、おそらく最初の呼び出しで 19 または 20 が使用されたようです。

于 2013-10-01T16:52:26.910 に答える