| 108 | } |
| 109 | |
| 110 | int64_t fast_rand_in_64(int64_t min, int64_t max) { |
| 111 | if (need_init(_tls_seed)) { |
| 112 | init_fast_rand_seed(&_tls_seed); |
| 113 | } |
| 114 | if (BAIDU_UNLIKELY(min >= max)) { |
| 115 | if (min == max) { |
| 116 | return min; |
| 117 | } |
| 118 | std::swap(min, max); |
| 119 | } |
| 120 | uint64_t range; |
| 121 | if (min >= 0) { |
| 122 | // Always safe to do subtraction. |
| 123 | range = (uint64_t)(max - min) + 1; |
| 124 | return min + (int64_t)fast_rand_impl(range, &_tls_seed); |
| 125 | } |
| 126 | |
| 127 | uint64_t abs_min = safe_abs(min); |
| 128 | if (max >= 0) { |
| 129 | range = abs_min + (uint64_t)(max) + 1; |
| 130 | } else { |
| 131 | range = abs_min - safe_abs(max) + 1; |
| 132 | } |
| 133 | if (range == 0) { |
| 134 | // max = INT64_MAX, min = INT64_MIN |
| 135 | return (int64_t)xorshift128_next(&_tls_seed); |
| 136 | } |
| 137 | uint64_t r = fast_rand_impl(range, &_tls_seed); |
| 138 | return r >= abs_min ? (int64_t)(r - abs_min) : -((int64_t)(abs_min - r)); |
| 139 | } |
| 140 | |
| 141 | uint64_t fast_rand_in_u64(uint64_t min, uint64_t max) { |
| 142 | if (need_init(_tls_seed)) { |
no test coverage detected