9
9
*/
10
10
11
11
package rand
12
- /*
13
- export
14
- srand // set rand state (int32)
15
- vrand // int64 63-bits
16
- lrand // int32 31-bits
17
- rand // int 15-bits
18
- vnrand // int64 % (int64)
19
- lnrand // int32 % (int32)
20
- nrand // int % (int)
21
- frand; // float64 >=0.0 <1.0
22
- */
12
+
13
+ // rand, rand31, rand63 - return non-negative random int, int32, int64
14
+ // urand32 - return random uint32
15
+ // nrand, nrand31, nrand63 - return 0 <= random < n
16
+ // frand, frand64, frand32 - return 0 <= random float, float64, float32 < 1
23
17
24
18
const
25
19
(
@@ -84,7 +78,7 @@ srand(seed int32)
84
78
}
85
79
86
80
export func
87
- vrand () int64
81
+ rand63 () int64
88
82
{
89
83
rng_tap -- ;
90
84
if rng_tap < 0 {
@@ -102,56 +96,72 @@ vrand() int64
102
96
}
103
97
104
98
export func
105
- lrand () int32
99
+ urand32 () uint32
106
100
{
107
- x := vrand () & 0x7fffffff ;
108
- return int32 (x );
101
+ return uint32 (rand63 () >> 31 );
109
102
}
110
103
111
104
export func
112
- rand () int
105
+ rand31 () int32
113
106
{
114
- x := vrand () & 0x7fff ;
115
- return int (x );
107
+ return int32 (rand63 () >> 32 );
116
108
}
117
109
118
110
export func
119
- vnrand ( n int64 ) int64
111
+ rand () int
120
112
{
121
- var v ,slop int64 ;
113
+ u := uint (rand63 ());
114
+ return int (u << 1 >> 1 ); // clear sign bit if int == int32
115
+ }
122
116
123
- slop = MASK % n ;
124
- for v = vrand (); v <= slop ; v = vrand () {
117
+ export func
118
+ nrand63 (n int64 ) int64
119
+ {
120
+ if n <= 0 {
121
+ return 0
125
122
}
126
- return v % n ;
123
+ max := int64 ((1 << 63 )- 1 - (1 << 63 ) % uint64 (n ));
124
+ v := rand63 ()
125
+ for v > max {
126
+ v = rand63 ()
127
+ }
128
+ return v % n
127
129
}
128
130
129
131
export func
130
- lnrand (n int32 ) int32
132
+ nrand31 (n int32 ) int32
131
133
{
132
- v := vnrand (int64 (n ));
133
- return int32 (v );
134
+ return int32 (nrand63 (int64 (n )))
134
135
}
135
136
136
137
export func
137
138
nrand (n int ) int
138
139
{
139
- v := vnrand (int64 (n ));
140
- return int (v );
140
+ return int (nrand63 (int64 (n )))
141
141
}
142
142
143
143
export func
144
- frand () float64
144
+ frand64 () float64
145
145
{
146
- var x float64 ;
147
-
148
- x = float64 (vrand ()) / float64 (MASK );
146
+ x := float64 (rand63 ()) / float64 (MASK );
149
147
for x >= 1 {
150
- x = float64 (vrand ()) / float64 (MASK );
151
- }
148
+ x = float64 (rand63 ()) / float64 (MASK );
149
+ }
152
150
return x ;
153
151
}
154
152
153
+ export func
154
+ frand32 () float32
155
+ {
156
+ return float32 (frand64 ())
157
+ }
158
+
159
+ export func
160
+ frand () float
161
+ {
162
+ return float (frand64 ())
163
+ }
164
+
155
165
func
156
166
init ()
157
167
{
0 commit comments