Skip to content

Commit f4f3fd0

Browse files
committed
RandomGenerator: Optimize randintExcept()
1 parent ec94941 commit f4f3fd0

File tree

2 files changed

+50
-5
lines changed

2 files changed

+50
-5
lines changed

src/engine/internal/randomgenerator.cpp

+18-5
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,23 @@ long RandomGenerator::randintExcept(long start, long end, long except) const
4747
if (start > end) {
4848
std::swap(start, end);
4949
}
50-
std::uniform_int_distribution<long> distribution(start, end);
51-
long value = distribution(*m_generator);
52-
if (value == except) {
53-
return randintExcept(start, end, except);
50+
51+
if (except < start || except > end) {
52+
return randint(start, end);
53+
} else if (start == end) {
54+
return start;
55+
} else if (end - start == 1) {
56+
if (except == start)
57+
return end;
58+
else
59+
return start;
60+
}
61+
62+
if (randint(0, 1) == 0) {
63+
std::uniform_int_distribution<long> distribution(start, except - 1);
64+
return distribution(*m_generator);
65+
} else {
66+
std::uniform_int_distribution<long> distribution(except + 1, end);
67+
return distribution(*m_generator);
5468
}
55-
return value;
5669
}

test/randomgenerator/randomgenerator_test.cpp

+32
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,36 @@ TEST(RandomGeneratorTest, RandIntExcept)
6464
ASSERT_LE(num, 5);
6565
ASSERT_NE(num, 2);
6666
}
67+
68+
for (int i = 0; i < 25; i++) {
69+
num = rng->randintExcept(5, 8, 2);
70+
ASSERT_GE(num, 5);
71+
ASSERT_LE(num, 8);
72+
}
73+
74+
for (int i = 0; i < 25; i++) {
75+
num = rng->randintExcept(5, 8, 10);
76+
ASSERT_GE(num, 5);
77+
ASSERT_LE(num, 8);
78+
}
79+
80+
for (int i = 0; i < 25; i++) {
81+
num = rng->randintExcept(2, 2, 2);
82+
ASSERT_EQ(num, 2);
83+
}
84+
85+
for (int i = 0; i < 25; i++) {
86+
num = rng->randintExcept(2, 2, 5);
87+
ASSERT_EQ(num, 2);
88+
}
89+
90+
for (int i = 0; i < 25; i++) {
91+
num = rng->randintExcept(1, 2, 1);
92+
ASSERT_EQ(num, 2);
93+
}
94+
95+
for (int i = 0; i < 25; i++) {
96+
num = rng->randintExcept(1, 2, 2);
97+
ASSERT_EQ(num, 1);
98+
}
6799
}

0 commit comments

Comments
 (0)