#include "random.h" #include <library/cpp/testing/unittest/registar.h> #include <util/generic/ylimits.h> template <class T> static inline void AssertRange(T v, T r1, T r2) { UNIT_ASSERT(v >= r1); UNIT_ASSERT(v < r2); } Y_UNIT_TEST_SUITE(TRandomNumberTest) { template <typename T> void TestAll(T n) { for (T i = 0; i < n; ++i) { while (RandomNumber<T>(n) != i) { } } } template <typename T> void TestSome(T n) { for (int i = 0; i < 100; ++i) { UNIT_ASSERT(RandomNumber<T>(n) < n); } } template <typename T> void TestType() { TestAll<T>(1); TestAll<T>(2); TestAll<T>(3); TestAll<T>(4); TestAll<T>(5); TestAll<T>(6); TestAll<T>(9); TestAll<T>(15); TestAll<T>(16); TestSome<T>(Max<T>()); TestSome<T>(Max<T>() - 1); TestSome<T>(Max<T>() - 2); TestSome<T>(Max<T>() - 3); TestSome<T>(Max<T>() - 4); TestSome<T>(Max<T>() - 5); TestSome<T>(Max<T>() - 7); TestSome<T>(Max<T>() - 8); TestSome<T>(Max<T>() - 2222); TestSome<T>(Max<T>() - 22222); } Y_UNIT_TEST(TestWithLimit) { TestType<unsigned short>(); TestType<unsigned int>(); TestType<unsigned long>(); TestType<unsigned long long>(); } Y_UNIT_TEST(TestRandomNumberFloat) { for (size_t i = 0; i < 1000; ++i) { AssertRange<float>(RandomNumber<float>(), 0.0, 1.0); } } Y_UNIT_TEST(TestRandomNumberDouble) { for (size_t i = 0; i < 1000; ++i) { AssertRange<double>(RandomNumber<double>(), 0.0, 1.0); } } Y_UNIT_TEST(TestRandomNumberLongDouble) { for (size_t i = 0; i < 1000; ++i) { AssertRange<long double>(RandomNumber<long double>(), 0.0, 1.0); } } Y_UNIT_TEST(TestBoolean) { while (RandomNumber<bool>()) { } while (!RandomNumber<bool>()) { } } Y_UNIT_TEST(TestResetSeed) { SetRandomSeed(42); for (const ui32 el : { 102, 179, 92, 14, 106, 71, 188, 20, 102, 121, 210, 214, 74, 202, 87, 116, 99, 103, 151, 130, 149, 52, 1, 87, 235, 157, 37, 129, 191, 187, 20, 160, 203, 57, 21, 252, 235, 88, 48, 218, 58, 254, 169, 255, 219, 187, 207, 14, 189, 189, 174, 189, 50, 107, 54, 243, 63, 248, 130, 228, 50, 134, 20, 72, }) { UNIT_ASSERT_EQUAL(RandomNumber<ui32>(1 << 8), el); } } }