Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/elmergrid/src/metis-5.1.0/GKlib/gk_mkrandom.h
3206 views
1
/*!
2
\file
3
\brief Templates for portable random number generation
4
5
\date Started 5/17/07
6
\author George
7
\version\verbatim $Id: gk_mkrandom.h 10711 2011-08-31 22:23:04Z karypis $ \endverbatim
8
*/
9
10
11
#ifndef _GK_MKRANDOM_H
12
#define _GK_MKRANDOM_H
13
14
/*************************************************************************/\
15
/*! The generator for the rand() related routines. \
16
\params RNGT the datatype that defines the range of values over which\
17
random numbers will be generated\
18
\params VALT the datatype that defines the contents of the array to \
19
be permuted by randArrayPermute() \
20
\params FPRFX the function prefix \
21
*/\
22
/**************************************************************************/\
23
#define GK_MKRANDOM(FPRFX, RNGT, VALT)\
24
/*************************************************************************/\
25
/*! Initializes the generator */ \
26
/**************************************************************************/\
27
void FPRFX ## srand(RNGT seed) \
28
{\
29
gk_randinit((uint64_t) seed);\
30
}\
31
\
32
\
33
/*************************************************************************/\
34
/*! Returns a random number */ \
35
/**************************************************************************/\
36
RNGT FPRFX ## rand() \
37
{\
38
if (sizeof(RNGT) <= sizeof(int32_t)) \
39
return (RNGT)gk_randint32(); \
40
else \
41
return (RNGT)gk_randint64(); \
42
}\
43
\
44
\
45
/*************************************************************************/\
46
/*! Returns a random number between [0, max) */ \
47
/**************************************************************************/\
48
RNGT FPRFX ## randInRange(RNGT max) \
49
{\
50
return (RNGT)((FPRFX ## rand())%max); \
51
}\
52
\
53
\
54
/*************************************************************************/\
55
/*! Randomly permutes the elements of an array p[]. \
56
flag == 1, p[i] = i prior to permutation, \
57
flag == 0, p[] is not initialized. */\
58
/**************************************************************************/\
59
void FPRFX ## randArrayPermute(RNGT n, VALT *p, RNGT nshuffles, int flag)\
60
{\
61
RNGT i, u, v;\
62
VALT tmp;\
63
\
64
if (flag == 1) {\
65
for (i=0; i<n; i++)\
66
p[i] = (VALT)i;\
67
}\
68
\
69
if (n < 10) {\
70
for (i=0; i<n; i++) {\
71
v = FPRFX ## randInRange(n);\
72
u = FPRFX ## randInRange(n);\
73
gk_SWAP(p[v], p[u], tmp);\
74
}\
75
}\
76
else {\
77
for (i=0; i<nshuffles; i++) {\
78
v = FPRFX ## randInRange(n-3);\
79
u = FPRFX ## randInRange(n-3);\
80
/*gk_SWAP(p[v+0], p[u+0], tmp);*/\
81
/*gk_SWAP(p[v+1], p[u+1], tmp);*/\
82
/*gk_SWAP(p[v+2], p[u+2], tmp);*/\
83
/*gk_SWAP(p[v+3], p[u+3], tmp);*/\
84
gk_SWAP(p[v+0], p[u+2], tmp);\
85
gk_SWAP(p[v+1], p[u+3], tmp);\
86
gk_SWAP(p[v+2], p[u+0], tmp);\
87
gk_SWAP(p[v+3], p[u+1], tmp);\
88
}\
89
}\
90
}\
91
\
92
\
93
/*************************************************************************/\
94
/*! Randomly permutes the elements of an array p[]. \
95
flag == 1, p[i] = i prior to permutation, \
96
flag == 0, p[] is not initialized. */\
97
/**************************************************************************/\
98
void FPRFX ## randArrayPermuteFine(RNGT n, VALT *p, int flag)\
99
{\
100
RNGT i, v;\
101
VALT tmp;\
102
\
103
if (flag == 1) {\
104
for (i=0; i<n; i++)\
105
p[i] = (VALT)i;\
106
}\
107
\
108
for (i=0; i<n; i++) {\
109
v = FPRFX ## randInRange(n);\
110
gk_SWAP(p[i], p[v], tmp);\
111
}\
112
}\
113
114
115
#define GK_MKRANDOM_PROTO(FPRFX, RNGT, VALT)\
116
void FPRFX ## srand(RNGT seed); \
117
RNGT FPRFX ## rand(); \
118
RNGT FPRFX ## randInRange(RNGT max); \
119
void FPRFX ## randArrayPermute(RNGT n, VALT *p, RNGT nshuffles, int flag);\
120
void FPRFX ## randArrayPermuteFine(RNGT n, VALT *p, int flag);\
121
122
123
#endif
124
125