| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
 | #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);
        }
    }
}
 |