/
normal.go
261 lines (255 loc) · 14.2 KB
/
normal.go
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
package random
import "math"
func genNormal(rng RNG) float64 {
for {
x := rng.Uint64()
j := int32(x)
i := int(x >> 32 & 255)
if uint32(j+j>>31^j>>31) < normalK[i] {
return float64(j) * float64(normalW[i])
}
if i != 0 {
v := float64(j) * float64(normalW[i])
if (normalF[i] + rng.Float32()*(normalF[i-1]-normalF[i])) < float32(math.Exp(-0.5*v*v)) {
return v
}
} else {
var v float64
for {
// Do 1-x to prevent log(0).
x := -math.Log(1-rng.Float64()) / normalR
y := -math.Log(1 - rng.Float64())
if y+y >= x*x {
v = x + normalR
break
}
}
if x>>63 != 0 {
return -v
}
return v
}
}
}
const normalR = 3.65415288536101
var normalK = [256]uint32{
0x7799ec01, 0x0, 0x6045f4c7, 0x6d1aa7d5, 0x728fb3f6, 0x7592af4e,
0x777a5c0b, 0x78ca3857, 0x79bf6b0f, 0x7a7a34ab, 0x7b0d2f20, 0x7b83d3aa,
0x7be59761, 0x7c378863, 0x7c7d32bc, 0x7cb9263a, 0x7ced483e, 0x7d1b07ac,
0x7d437ef2, 0x7d678b06, 0x7d87db38, 0x7da4fc6a, 0x7dbf611b, 0x7dd7674d,
0x7ded5ce8, 0x7e018307, 0x7e141081, 0x7e2533d7, 0x7e3514bb, 0x7e43d549,
0x7e5192f2, 0x7e5e6748, 0x7e6a6897, 0x7e75aa6c, 0x7e803df8, 0x7e8a326e,
0x7e939547, 0x7e9c727f, 0x7ea4d4cc, 0x7eacc5c4, 0x7eb44e04, 0x7ebb754e,
0x7ec242a3, 0x7ec8bc5d, 0x7ecee83d, 0x7ed4cb80, 0x7eda6aee, 0x7edfcae2,
0x7ee4ef5d, 0x7ee9dc08, 0x7eee9441, 0x7ef31b21, 0x7ef77384, 0x7efba00d,
0x7effa32c, 0x7f037f25, 0x7f073611, 0x7f0ac9e1, 0x7f0e3c65, 0x7f118f4e,
0x7f14c42e, 0x7f17dc7d, 0x7f1ad99a, 0x7f1dbcce, 0x7f20874c, 0x7f233a36,
0x7f25d69a, 0x7f285d76, 0x7f2acfba, 0x7f2d2e47, 0x7f2f79f0, 0x7f31b37e,
0x7f33dbae, 0x7f35f330, 0x7f37faaf, 0x7f39f2c8, 0x7f3bdc11, 0x7f3db71b,
0x7f3f846b, 0x7f414482, 0x7f42f7d9, 0x7f449ee4, 0x7f463a0f, 0x7f47c9c3,
0x7f494e64, 0x7f4ac84e, 0x7f4c37dc, 0x7f4d9d63, 0x7f4ef934, 0x7f504b9d,
0x7f5194e7, 0x7f52d559, 0x7f540d36, 0x7f553cbe, 0x7f56642f, 0x7f5783c3,
0x7f589bb1, 0x7f59ac2f, 0x7f5ab571, 0x7f5bb7a7, 0x7f5cb2ff, 0x7f5da7a6,
0x7f5e95c7, 0x7f5f7d8b, 0x7f605f18, 0x7f613a95, 0x7f621024, 0x7f62dfe9,
0x7f63aa03, 0x7f646e92, 0x7f652db4, 0x7f65e786, 0x7f669c22, 0x7f674ba4,
0x7f67f623, 0x7f689bb9, 0x7f693c7c, 0x7f69d881, 0x7f6a6fdd, 0x7f6b02a4,
0x7f6b90ea, 0x7f6c1abf, 0x7f6ca035, 0x7f6d215c, 0x7f6d9e43, 0x7f6e16fa,
0x7f6e8b8d, 0x7f6efc09, 0x7f6f687c, 0x7f6fd0f0, 0x7f703570, 0x7f709606,
0x7f70f2bc, 0x7f714b9a, 0x7f71a0a8, 0x7f71f1ed, 0x7f723f71, 0x7f728938,
0x7f72cf4a, 0x7f7311a9, 0x7f73505a, 0x7f738b61, 0x7f73c2c1, 0x7f73f67b,
0x7f742692, 0x7f745305, 0x7f747bd6, 0x7f74a103, 0x7f74c28d, 0x7f74e070,
0x7f74faab, 0x7f75113b, 0x7f75241b, 0x7f753347, 0x7f753ebb, 0x7f754670,
0x7f754a5f, 0x7f754a81, 0x7f7546ce, 0x7f753f3c, 0x7f7533c2, 0x7f752455,
0x7f7510e9, 0x7f74f971, 0x7f74dde1, 0x7f74be29, 0x7f749a39, 0x7f747202,
0x7f744571, 0x7f741473, 0x7f73def5, 0x7f73a4df, 0x7f73661d, 0x7f732294,
0x7f72da2d, 0x7f728cca, 0x7f723a50, 0x7f71e29f, 0x7f718597, 0x7f712315,
0x7f70baf5, 0x7f704d11, 0x7f6fd93f, 0x7f6f5f53, 0x7f6edf21, 0x7f6e5876,
0x7f6dcb20, 0x7f6d36e7, 0x7f6c9b91, 0x7f6bf8e1, 0x7f6b4e95, 0x7f6a9c68,
0x7f69e20e, 0x7f691f3b, 0x7f685399, 0x7f677ed0, 0x7f66a080, 0x7f65b844,
0x7f64c5b0, 0x7f63c850, 0x7f62bfa8, 0x7f61ab34, 0x7f608a65, 0x7f5f5ca4,
0x7f5e214d, 0x7f5cd7af, 0x7f5b7f0e, 0x7f5a169d, 0x7f589d80, 0x7f5712c8,
0x7f557574, 0x7f53c46c, 0x7f51fe7f, 0x7f502264, 0x7f4e2eb1, 0x7f4c21dd,
0x7f49fa38, 0x7f47b5eb, 0x7f4552ee, 0x7f42cf03, 0x7f4027b4, 0x7f3d5a44,
0x7f3a63a8, 0x7f374081, 0x7f33ed05, 0x7f3064f9, 0x7f2ca399, 0x7f28a384,
0x7f245ea1, 0x7f1fcdff, 0x7f1ae9af, 0x7f15a891, 0x7f10001c, 0x7f09e413,
0x7f034627, 0x7efc1581, 0x7ef43e2b, 0x7eeba84e, 0x7ee23729, 0x7ed7c7c1,
0x7ecc2f0d, 0x7ebf377a, 0x7eb09d6d, 0x7ea00a4f, 0x7e8d0d3d, 0x7e771023,
0x7e5d46c2, 0x7e3e9376, 0x7e195978, 0x7deb2c0e, 0x7db03620, 0x7d6202c1,
0x7cf4b8f0, 0x7c4fd245, 0x7b362fbf, 0x78d2d259,
}
var normalW = [256]float32{
1.82108858578136e-9, 1.00229818366879e-10, 1.33260428808663e-10,
1.56339965394896e-10, 1.74679482764742e-10, 1.90171010145913e-10,
2.03735382392943e-10, 2.15896562110112e-10, 2.26983784762787e-10,
2.37218723447105e-10, 2.46758442680146e-10, 2.55718688632904e-10,
2.6418746311861e-10, 2.72233395886784e-10, 2.79911150110882e-10,
2.87265046503279e-10, 2.94331571267015e-10, 3.01141159094402e-10,
3.07719490604671e-10, 3.14088455791256e-10, 3.20266882328218e-10,
3.2627109489721e-10, 3.32115350845724e-10, 3.37812183848582e-10,
3.43372678120758e-10, 3.48806689501654e-10, 3.54123025401546e-10,
3.59329592541125e-10, 3.64433519219623e-10, 3.69441257249854e-10,
3.74358667521724e-10, 3.79191092278443e-10, 3.8394341652854e-10,
3.88620120513431e-10, 3.93225324763522e-10, 3.97762828975992e-10,
4.02236145713045e-10, 4.06648529734863e-10, 4.11003003635055e-10,
4.15302380329436e-10, 4.19549282854992e-10, 4.23746161859817e-10,
4.27895311103012e-10, 4.31998881232925e-10, 4.36058892070584e-10,
4.40077243590804e-10, 4.44055725764989e-10, 4.47996027405858e-10,
4.51899744134501e-10, 4.55768385573395e-10, 4.59603381854977e-10,
4.63406089523384e-10, 4.6717779689686e-10, 4.70919728949664e-10,
4.74633051764911e-10, 4.78318876603453e-10, 4.81978263628409e-10,
4.8561222532026e-10, 4.89221729613342e-10, 4.92807702781016e-10,
4.96371032093709e-10, 4.99912568271363e-10, 5.03433127749434e-10,
5.06933494775547e-10, 5.10414423352117e-10, 5.13876639038622e-10,
5.17320840625826e-10, 5.20747701693021e-10, 5.24157872058234e-10,
5.27551979130383e-10, 5.30930629171501e-10, 5.34294408476376e-10,
5.37643884476241e-10, 5.40979606772592e-10, 5.44302108106591e-10,
5.4761190526907e-10, 5.50909499955683e-10, 5.5419537957138e-10,
5.57470017987975e-10, 5.60733876258312e-10, 5.63987403290206e-10,
5.67231036483069e-10, 5.70465202329927e-10, 5.73690316987287e-10,
5.76906786815118e-10, 5.80115008889058e-10, 5.83315371486776e-10,
5.86508254550264e-10, 5.89694030125732e-10, 5.92873062782621e-10,
5.96045710013163e-10, 5.99212322613804e-10, 6.02373245049709e-10,
6.05528815803508e-10, 6.08679367709314e-10, 6.1182522827304e-10,
6.14966719979912e-10, 6.18104160590063e-10, 6.21237863423005e-10,
6.24368137631753e-10, 6.27495288467308e-10, 6.30619617534166e-10,
6.33741423037501e-10, 6.36861000022607e-10, 6.3997864060717e-10,
6.43094634206898e-10, 6.46209267755028e-10, 6.49322825916177e-10,
6.52435591295013e-10, 6.55547844640165e-10, 6.58659865043811e-10,
6.61771930137327e-10, 6.64884316283397e-10, 6.67997298764946e-10,
6.7111115197126e-10, 6.74226149581641e-10, 6.77342564746929e-10,
6.80460670269223e-10, 6.83580738780126e-10, 6.86703042917818e-10,
6.89827855503274e-10, 6.92955449715931e-10, 6.96086099269098e-10,
6.9922007858542e-10, 7.02357662972674e-10, 7.05499128800218e-10,
7.08644753676373e-10, 7.11794816627033e-10, 7.1494959827583e-10,
7.18109381026124e-10, 7.21274449245154e-10, 7.24445089450654e-10,
7.27621590500253e-10, 7.3080424378399e-10, 7.33993343420283e-10,
7.37189186455696e-10, 7.40392073068857e-10, 7.4360230677891e-10,
7.46820194658867e-10, 7.50046047554272e-10, 7.53280180307578e-10,
7.56522911988681e-10, 7.59774566132051e-10, 7.6303547098094e-10,
7.66305959739155e-10, 7.69586370830916e-10, 7.72877048169348e-10,
7.76178341434181e-10, 7.79490606359264e-10, 7.82814205030526e-10,
7.86149506195074e-10, 7.89496885582135e-10, 7.92856726236606e-10,
7.96229418866011e-10, 7.99615362201735e-10, 8.03014963375425e-10,
8.06428638311551e-10, 8.09856812137138e-10, 8.13299919609782e-10,
8.16758405565131e-10, 8.20232725385069e-10, 8.23723345487969e-10,
8.27230743842443e-10, 8.3075541050613e-10, 8.34297848191188e-10,
8.37858572858255e-10, 8.41438114340799e-10, 8.45037017001902e-10,
8.48655840425699e-10, 8.52295160145851e-10, 8.55955568413626e-10,
8.59637675008357e-10, 8.63342108093296e-10, 8.67069515120086e-10,
8.7082056378539e-10, 8.74595943043472e-10, 8.78396364178873e-10,
8.82222561943673e-10, 8.86075295764221e-10, 8.89955351022656e-10,
8.93863540418999e-10, 8.97800705420163e-10, 9.01767717802755e-10,
9.05765481297243e-10, 9.09794933341745e-10, 9.13857046954503e-10,
9.17952832734985e-10, 9.22083341004549e-10, 9.26249664098694e-10,
9.30452938824156e-10, 9.34694349095472e-10, 9.38975128767176e-10,
9.43296564679525e-10, 9.47659999937573e-10, 9.52066837445615e-10,
9.5651854372148e-10, 9.61016653017948e-10, 9.65562771781694e-10,
9.70158583483801e-10, 9.7480585385989e-10, 9.79506436602621e-10,
9.84262279554574e-10, 9.89075431455636e-10, 9.93948049305946e-10,
9.98882406413503e-10, 1.00388090120477e-9, 1.00894606688726e-9,
1.01408058206564e-9, 1.01928728242701e-9, 1.02456917362813e-9,
1.02992944553688e-9, 1.0353714880033e-9, 1.04089890836269e-9,
1.04651555090555e-9, 1.05222551858695e-9, 1.05803319729324e-9,
1.06394328303844e-9, 1.06996081252716e-9, 1.07609119759936e-9,
1.08234026416723e-9, 1.08871429636913e-9, 1.09522008680699e-9,
1.10186499390625e-9, 1.10865700765144e-9, 1.11560482521631e-9,
1.12271793833986e-9, 1.13000673471817e-9, 1.13748261621239e-9,
1.14515813735067e-9, 1.15304716847396e-9, 1.16116508900702e-9,
1.16952901781848e-9, 1.17815808959298e-9, 1.18707378875687e-9,
1.19630035603505e-9, 1.20586528755179e-9, 1.21579995308482e-9,
1.22614036948959e-9, 1.2369281787317e-9, 1.24821189943969e-9,
1.2600485496796e-9, 1.27250578209945e-9, 1.28566473968326e-9,
1.29962394666016e-9, 1.31450472251812e-9, 1.33045889943523e-9,
1.34768013545005e-9, 1.36642105281767e-9, 1.38702023768883e-9,
1.40994684387445e-9, 1.43587874807517e-9, 1.4658501788592e-9,
1.501559769757e-9, 1.5461094369366e-9, 1.60619537279076e-9,
1.7015975366165e-9,
}
var normalF = [256]float32{
1.0, 0.977101701267671, 0.959879091800106,
0.945198953442299, 0.93206007595923, 0.919991505039347,
0.908726440052131, 0.898095921898343, 0.887984660755833,
0.878309655808917, 0.869008688036857, 0.860033621196331,
0.851346258458678, 0.842915653112204, 0.834716292986883,
0.826726833946221, 0.818929191603702, 0.811307874312656,
0.803849483170964, 0.796542330422959, 0.789376143566024,
0.782341832654802, 0.775431304981187, 0.768637315798486,
0.761953346836795, 0.755373506507096, 0.748892447219156,
0.742505296340151, 0.736207598126862, 0.729995264561476,
0.72386453346863, 0.717811932630722, 0.711834248878248,
0.705928501332754, 0.700091918136511, 0.694321916126116,
0.688616083004671, 0.682972161644994, 0.677388036218773,
0.671861719897082, 0.66639134390875, 0.660975147776663,
0.655611470579697, 0.650298743110816, 0.645035480820822,
0.639820277453056, 0.634651799287623, 0.629528779924836,
0.624450015547026, 0.619414360605834, 0.614420723888914,
0.609468064925773, 0.604555390697467, 0.599681752619125,
0.594846243767987, 0.590047996332826, 0.585286179263371,
0.58055999610079, 0.575868682972353, 0.571211506735253,
0.566587763256164, 0.561996775814524, 0.557437893618766,
0.552910490425832, 0.548413963255265, 0.543947731190026,
0.539511234256952, 0.535103932380457, 0.530725304403662,
0.526374847171684, 0.522052074672321, 0.517756517229756,
0.513487720747327, 0.509245245995748, 0.505028667943468,
0.500837575126148, 0.496671569052489, 0.492530263643868,
0.488413284705458, 0.484320269426683, 0.480250865909046,
0.476204732719506, 0.47218153846773, 0.468180961405693,
0.464202689048174, 0.460246417812843, 0.456311852678716,
0.452398706861848, 0.448506701507203, 0.444635565395739,
0.440785034665804, 0.436954852547985, 0.433144769112652,
0.429354541029441, 0.425583931338022, 0.421832709229496,
0.418100649837848, 0.414387534040891, 0.410693148270188,
0.407017284329473, 0.403359739221114, 0.399720314980197,
0.396098818515832, 0.392495061459315, 0.388908860018789,
0.385340034840077, 0.381788410873393, 0.378253817245619,
0.374736087137891, 0.371235057668239, 0.367750569779032,
0.364282468129004, 0.360830600989648, 0.35739482014578,
0.353974980800077, 0.350570941481406, 0.347182563956794,
0.343809713146851, 0.340452257044522, 0.337110066637006,
0.333783015830718, 0.330470981379163, 0.327173842813601,
0.323891482376391, 0.320623784956905, 0.317370638029914,
0.314131931596337, 0.310907558126286, 0.307697412504292,
0.30450139197665, 0.301319396100803, 0.298151326696685,
0.294997087799962, 0.291856585617095, 0.288729728482183,
0.285616426815502, 0.282516593083707, 0.279430141761638,
0.276356989295668, 0.273297054068577, 0.270250256365875,
0.267216518343561, 0.264195763997261, 0.261187919132721,
0.258192911337619, 0.255210669954662, 0.252241126055942,
0.249284212418528, 0.246339863501264, 0.24340801542275,
0.2404886059405, 0.237581574431238, 0.23468686187233,
0.231804410824339, 0.22893416541468, 0.22607607132238,
0.223230075763917, 0.220396127480152, 0.217574176724331,
0.214764175251174, 0.21196607630703, 0.209179834621125,
0.206405406397881, 0.203642749310335, 0.200891822494657,
0.198152586545775, 0.195425003514134, 0.192709036903589,
0.190004651670465, 0.1873118142238, 0.184630492426799,
0.181960655599523, 0.179302274522848, 0.176655321443735,
0.174019770081839, 0.171395595637506, 0.168782774801212,
0.166181285764482, 0.163591108232366, 0.161012223437511,
0.158444614155924, 0.155888264724479, 0.153343161060263,
0.150809290681846, 0.148286642732575, 0.145775208005994,
0.143274978973513, 0.140785949814445, 0.138308116448551,
0.135841476571254, 0.133386029691669, 0.130941777173644,
0.12850872228, 0.126086870220186, 0.123676228201597,
0.12127680548479, 0.11888861344291, 0.116511665625611,
0.114145977827838, 0.111791568163838, 0.109448457146812,
0.107116667774684, 0.104796225622487, 0.102487158941935,
0.10018949876881, 0.0979032790388623, 0.0956285367130088,
0.0933653119126909, 0.0911136480663736, 0.0888735920682758,
0.086645194450558, 0.0844285095703534, 0.0822235958132029,
0.0800305158146631, 0.0778493367020961, 0.0756801303589271,
0.0735229737139813, 0.0713779490588904, 0.0692451443970068,
0.0671246538277885, 0.0650165779712429, 0.0629210244377581,
0.0608381083495399, 0.0587679529209338, 0.0567106901062029,
0.0546664613248889, 0.0526354182767922, 0.0506177238609478,
0.0486135532158685, 0.0466230949019304, 0.0446465522512944,
0.0426841449164744, 0.0407361106559409, 0.0388027074045261,
0.0368842156885673, 0.0349809414617161, 0.0330932194585785,
0.0312214171919202, 0.0293659397581333, 0.0275272356696031,
0.0257058040085489, 0.0239022033057959, 0.0221170627073089,
0.0203510962300445, 0.0186051212757246, 0.0168800831525432,
0.0151770883079353, 0.0134974506017399, 0.0118427578579079,
0.0102149714397015, 0.00861658276939873, 0.00705087547137323,
0.005522403299251, 0.00403797259336303, 0.00260907274610216,
0.0012602859304986,
}