forked from apache/brpc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfast_rand.h
55 lines (43 loc) · 1.61 KB
/
fast_rand.h
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
// Copyright (c) 2015 Baidu.com, Inc. All Rights Reserved
// Author: Ge,Jun (gejun@baidu.com)
// Date: Thu Dec 31 13:35:39 CST 2015
#ifndef PUBLIC_COMMON_BASE_FAST_RAND_H
#define PUBLIC_COMMON_BASE_FAST_RAND_H
#include <stdint.h>
namespace base {
// Generate random values fast without global contentions.
// All functions in this header are thread-safe.
struct FastRandSeed {
uint64_t s[2];
};
// Initialize the seed.
void init_fast_rand_seed(FastRandSeed* seed);
// Generate an unsigned 64-bit random number from thread-local or given seed.
// Cost: ~5ns
uint64_t fast_rand();
uint64_t fast_rand(FastRandSeed*);
// Generate an unsigned 64-bit random number inside [0, range) from
// thread-local seed.
// Returns 0 when range is 0.
// Cost: ~30ns
// Note that this can be used as an adapter for std::random_shuffle():
// std::random_shuffle(myvector.begin(), myvector.end(), base::fast_rand_less_than);
uint64_t fast_rand_less_than(uint64_t range);
// Generate a 64-bit random number inside [min, max] (inclusive!)
// from thread-local seed.
// NOTE: this function needs to be a template to be overloadable properly.
// Cost: ~30ns
template <typename T> T fast_rand_in(T min, T max) {
extern int64_t fast_rand_in_64(int64_t min, int64_t max);
extern uint64_t fast_rand_in_u64(uint64_t min, uint64_t max);
if ((T)-1 < 0) {
return fast_rand_in_64((int64_t)min, (int64_t)max);
} else {
return fast_rand_in_u64((uint64_t)min, (uint64_t)max);
}
}
// Generate a random double in [0, 1) from thread-local seed.
// Cost: ~15ns
double fast_rand_double();
}
#endif // PUBLIC_COMMON_BASE_FAST_RAND_H