-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrand.h
96 lines (82 loc) · 1.44 KB
/
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
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
static float randf() // Inclusive
{
#ifndef ACG_RAND_NO_ALG
return clamp01f(rand() / (float)RAND_MAX);
#else
const float result = rand() / (float)RAND_MAX;
return result > 1.f ? 1.f :
(result < 0.f ? 0.f : result);
#endif
}
static float randfx() // Exclusive at max
{
return fmodf(randf(), 1.f);
}
static int randb()
{
return randf() > .5f;
}
static float srandf()
{
return 2.f * randf() - 1.f;
}
static float randr(const float min, const float max) // Inclusive
{
assert(max >= min);
return randf() * (max - min) + min;
}
static char randc()
{
return 'A' + 25 * randf();
}
static u32 randu32(
const u32 min // Inclusive
, const u32 max // Exclusive
) {
assert(max > min);
return rand() % (max - min) + min;
}
static enum coin {
COIN_TAILS
, COIN_HEADS
} coin_flip() { return randb() ; }
static u32 rand_d(const u32 n)
{
assert(n);
return randu32(1, n + 1);
}
#ifndef ACG_RAND_NO_ALG
#define RAND(N) static v ## N randv ## N () \
{ \
v ## N v; \
for (size_t i = 0; i < N; ++i) \
v.s[i] = randf(); \
return v; \
}
RAND(2)
RAND(3)
RAND(4)
#undef RAND
#define SRAND(N) static v ## N srandv ## N () \
{ \
v ## N v; \
for (size_t i = 0; i < N; ++i) \
v.s[i] = srandf(); \
return v; \
}
SRAND(2)
SRAND(3)
SRAND(4)
#undef SRAND
#define DRAND(N) static v ## N drandv ## N () \
{ \
v ## N v; \
for (size_t i = 0; i < N; ++i) \
v.s[i] = srandf(); \
return v ## N ## _norm(v); \
}
DRAND(2)
DRAND(3)
DRAND(4)
#undef DRAND
#endif