github.com/haraldrudell/parl@v0.4.176/prand/rand.go (about) 1 /* 2 2023–present Harald Rudell <harald.rudell@gmail.com> (https://haraldrudell.github.io/haraldrudell/) 3 ISC License 4 5 these functions are largely copied from math/rand package in order to be compatible 6 while relying on fast and thread-safe fastrand methods provided by this package 7 */ 8 9 package prand 10 11 import "math" 12 13 const ( 14 re = 7.69711747013104972 15 rn = 3.442619855899 16 ) 17 18 // these functions are largely copied from math/rand package in order to be compatible 19 // while relying on fast and thread-safe fastrand methods provided by this package 20 21 // Shuffle pseudo-randomizes the order of elements. 22 // n is the number of elements. Shuffle panics if n < 0. 23 // swap swaps the elements with indexes i and j. Thread-safe. 24 func Shuffle(n int, swap func(i, j int)) { 25 if n < 0 { 26 panic("invalid argument to Shuffle") 27 } 28 29 // Fisher-Yates shuffle: https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle 30 // Shuffle really ought not be called with n that doesn't fit in 32 bits. 31 // Not only will it take a very long time, but with 2³¹! possible permutations, 32 // there's no way that any PRNG can have a big enough internal state to 33 // generate even a minuscule percentage of the possible permutations. 34 // Nevertheless, the right API signature accepts an int n, so handle it as best we can. 35 i := n - 1 36 for ; i > 1<<31-1-1; i-- { 37 j := int(Int63n(int64(i + 1))) 38 swap(i, j) 39 } 40 for ; i > 0; i-- { 41 j := int(Int31n(int32(i + 1))) 42 swap(i, j) 43 } 44 } 45 46 // Int63n returns, as an int64, a non-negative pseudo-random number in [0,n). 47 // It panics if n <= 0. Thread-safe. 48 func Int63n(n int64) int64 { 49 if n <= 0 { 50 panic("invalid argument to Int63n") 51 } 52 return int64(Uint64n(uint64(n))) 53 } 54 55 // Uint64n returns, as a uint64, a pseudo-random number in [0,n). 56 // It is guaranteed more uniform than taking a Source value mod n 57 // for any n that is not a power of 2. Thread-safe. 58 func Uint64n(n uint64) uint64 { 59 if n&(n-1) == 0 { // n is power of two, can mask 60 if n == 0 { 61 panic("invalid argument to Uint64n") 62 } 63 return Uint64() & (n - 1) 64 } 65 // If n does not divide v, to avoid bias we must not use 66 // a v that is within maxUint64%n of the top of the range. 67 v := Uint64() 68 if v > math.MaxUint64-n { // Fast check. 69 ceiling := math.MaxUint64 - math.MaxUint64%n 70 for v >= ceiling { 71 v = Uint64() 72 } 73 } 74 75 return v % n 76 } 77 78 // ExpFloat64 returns an exponentially distributed float64 in the range 79 // (0, +math.MaxFloat64] with an exponential distribution whose rate parameter 80 // (lambda) is 1 and whose mean is 1/lambda (1). 81 // To produce a distribution with a different rate parameter, 82 // callers can adjust the output using: 83 // 84 // sample = ExpFloat64() / desiredRateParameter 85 func ExpFloat64() float64 { 86 for { 87 j := Uint32() 88 i := j & 0xFF 89 x := float64(j) * float64(we[i]) 90 if j < ke[i] { 91 return x 92 } 93 if i == 0 { 94 return re - math.Log(Float64()) 95 } 96 if fe[i]+float32(Float64())*(fe[i-1]-fe[i]) < float32(math.Exp(-x)) { 97 return x 98 } 99 } 100 } 101 102 var ke = [256]uint32{ 103 0xe290a139, 0x0, 0x9beadebc, 0xc377ac71, 0xd4ddb990, 104 0xde893fb8, 0xe4a8e87c, 0xe8dff16a, 0xebf2deab, 0xee49a6e8, 105 0xf0204efd, 0xf19bdb8e, 0xf2d458bb, 0xf3da104b, 0xf4b86d78, 106 0xf577ad8a, 0xf61de83d, 0xf6afb784, 0xf730a573, 0xf7a37651, 107 0xf80a5bb6, 0xf867189d, 0xf8bb1b4f, 0xf9079062, 0xf94d70ca, 108 0xf98d8c7d, 0xf9c8928a, 0xf9ff175b, 0xfa319996, 0xfa6085f8, 109 0xfa8c3a62, 0xfab5084e, 0xfadb36c8, 0xfaff0410, 0xfb20a6ea, 110 0xfb404fb4, 0xfb5e2951, 0xfb7a59e9, 0xfb95038c, 0xfbae44ba, 111 0xfbc638d8, 0xfbdcf892, 0xfbf29a30, 0xfc0731df, 0xfc1ad1ed, 112 0xfc2d8b02, 0xfc3f6c4d, 0xfc5083ac, 0xfc60ddd1, 0xfc708662, 113 0xfc7f8810, 0xfc8decb4, 0xfc9bbd62, 0xfca9027c, 0xfcb5c3c3, 114 0xfcc20864, 0xfccdd70a, 0xfcd935e3, 0xfce42ab0, 0xfceebace, 115 0xfcf8eb3b, 0xfd02c0a0, 0xfd0c3f59, 0xfd156b7b, 0xfd1e48d6, 116 0xfd26daff, 0xfd2f2552, 0xfd372af7, 0xfd3eeee5, 0xfd4673e7, 117 0xfd4dbc9e, 0xfd54cb85, 0xfd5ba2f2, 0xfd62451b, 0xfd68b415, 118 0xfd6ef1da, 0xfd750047, 0xfd7ae120, 0xfd809612, 0xfd8620b4, 119 0xfd8b8285, 0xfd90bcf5, 0xfd95d15e, 0xfd9ac10b, 0xfd9f8d36, 120 0xfda43708, 0xfda8bf9e, 0xfdad2806, 0xfdb17141, 0xfdb59c46, 121 0xfdb9a9fd, 0xfdbd9b46, 0xfdc170f6, 0xfdc52bd8, 0xfdc8ccac, 122 0xfdcc542d, 0xfdcfc30b, 0xfdd319ef, 0xfdd6597a, 0xfdd98245, 123 0xfddc94e5, 0xfddf91e6, 0xfde279ce, 0xfde54d1f, 0xfde80c52, 124 0xfdeab7de, 0xfded5034, 0xfdefd5be, 0xfdf248e3, 0xfdf4aa06, 125 0xfdf6f984, 0xfdf937b6, 0xfdfb64f4, 0xfdfd818d, 0xfdff8dd0, 126 0xfe018a08, 0xfe03767a, 0xfe05536c, 0xfe07211c, 0xfe08dfc9, 127 0xfe0a8fab, 0xfe0c30fb, 0xfe0dc3ec, 0xfe0f48b1, 0xfe10bf76, 128 0xfe122869, 0xfe1383b4, 0xfe14d17c, 0xfe1611e7, 0xfe174516, 129 0xfe186b2a, 0xfe19843e, 0xfe1a9070, 0xfe1b8fd6, 0xfe1c8289, 130 0xfe1d689b, 0xfe1e4220, 0xfe1f0f26, 0xfe1fcfbc, 0xfe2083ed, 131 0xfe212bc3, 0xfe21c745, 0xfe225678, 0xfe22d95f, 0xfe234ffb, 132 0xfe23ba4a, 0xfe241849, 0xfe2469f2, 0xfe24af3c, 0xfe24e81e, 133 0xfe25148b, 0xfe253474, 0xfe2547c7, 0xfe254e70, 0xfe25485a, 134 0xfe25356a, 0xfe251586, 0xfe24e88f, 0xfe24ae64, 0xfe2466e1, 135 0xfe2411df, 0xfe23af34, 0xfe233eb4, 0xfe22c02c, 0xfe22336b, 136 0xfe219838, 0xfe20ee58, 0xfe20358c, 0xfe1f6d92, 0xfe1e9621, 137 0xfe1daef0, 0xfe1cb7ac, 0xfe1bb002, 0xfe1a9798, 0xfe196e0d, 138 0xfe1832fd, 0xfe16e5fe, 0xfe15869d, 0xfe141464, 0xfe128ed3, 139 0xfe10f565, 0xfe0f478c, 0xfe0d84b1, 0xfe0bac36, 0xfe09bd73, 140 0xfe07b7b5, 0xfe059a40, 0xfe03644c, 0xfe011504, 0xfdfeab88, 141 0xfdfc26e9, 0xfdf98629, 0xfdf6c83b, 0xfdf3ec01, 0xfdf0f04a, 142 0xfdedd3d1, 0xfdea953d, 0xfde7331e, 0xfde3abe9, 0xfddffdfb, 143 0xfddc2791, 0xfdd826cd, 0xfdd3f9a8, 0xfdcf9dfc, 0xfdcb1176, 144 0xfdc65198, 0xfdc15bb3, 0xfdbc2ce2, 0xfdb6c206, 0xfdb117be, 145 0xfdab2a63, 0xfda4f5fd, 0xfd9e7640, 0xfd97a67a, 0xfd908192, 146 0xfd8901f2, 0xfd812182, 0xfd78d98e, 0xfd7022bb, 0xfd66f4ed, 147 0xfd5d4732, 0xfd530f9c, 0xfd48432b, 0xfd3cd59a, 0xfd30b936, 148 0xfd23dea4, 0xfd16349e, 0xfd07a7a3, 0xfcf8219b, 0xfce7895b, 149 0xfcd5c220, 0xfcc2aadb, 0xfcae1d5e, 0xfc97ed4e, 0xfc7fe6d4, 150 0xfc65ccf3, 0xfc495762, 0xfc2a2fc8, 0xfc07ee19, 0xfbe213c1, 151 0xfbb8051a, 0xfb890078, 0xfb5411a5, 0xfb180005, 0xfad33482, 152 0xfa839276, 0xfa263b32, 0xf9b72d1c, 0xf930a1a2, 0xf889f023, 153 0xf7b577d2, 0xf69c650c, 0xf51530f0, 0xf2cb0e3c, 0xeeefb15d, 154 0xe6da6ecf, 155 } 156 var we = [256]float32{ 157 2.0249555e-09, 1.486674e-11, 2.4409617e-11, 3.1968806e-11, 158 3.844677e-11, 4.4228204e-11, 4.9516443e-11, 5.443359e-11, 159 5.905944e-11, 6.344942e-11, 6.7643814e-11, 7.1672945e-11, 160 7.556032e-11, 7.932458e-11, 8.298079e-11, 8.654132e-11, 161 9.0016515e-11, 9.3415074e-11, 9.674443e-11, 1.0001099e-10, 162 1.03220314e-10, 1.06377254e-10, 1.09486115e-10, 1.1255068e-10, 163 1.1557435e-10, 1.1856015e-10, 1.2151083e-10, 1.2442886e-10, 164 1.2731648e-10, 1.3017575e-10, 1.3300853e-10, 1.3581657e-10, 165 1.3860142e-10, 1.4136457e-10, 1.4410738e-10, 1.4683108e-10, 166 1.4953687e-10, 1.5222583e-10, 1.54899e-10, 1.5755733e-10, 167 1.6020171e-10, 1.6283301e-10, 1.6545203e-10, 1.6805951e-10, 168 1.7065617e-10, 1.732427e-10, 1.7581973e-10, 1.7838787e-10, 169 1.8094774e-10, 1.8349985e-10, 1.8604476e-10, 1.8858298e-10, 170 1.9111498e-10, 1.9364126e-10, 1.9616223e-10, 1.9867835e-10, 171 2.0119004e-10, 2.0369768e-10, 2.0620168e-10, 2.087024e-10, 172 2.1120022e-10, 2.136955e-10, 2.1618855e-10, 2.1867974e-10, 173 2.2116936e-10, 2.2365775e-10, 2.261452e-10, 2.2863202e-10, 174 2.311185e-10, 2.3360494e-10, 2.360916e-10, 2.3857874e-10, 175 2.4106667e-10, 2.4355562e-10, 2.4604588e-10, 2.485377e-10, 176 2.5103128e-10, 2.5352695e-10, 2.560249e-10, 2.585254e-10, 177 2.6102867e-10, 2.6353494e-10, 2.6604446e-10, 2.6855745e-10, 178 2.7107416e-10, 2.7359479e-10, 2.761196e-10, 2.7864877e-10, 179 2.8118255e-10, 2.8372119e-10, 2.8626485e-10, 2.888138e-10, 180 2.9136826e-10, 2.939284e-10, 2.9649452e-10, 2.9906677e-10, 181 3.016454e-10, 3.0423064e-10, 3.0682268e-10, 3.0942177e-10, 182 3.1202813e-10, 3.1464195e-10, 3.1726352e-10, 3.19893e-10, 183 3.2253064e-10, 3.251767e-10, 3.2783135e-10, 3.3049485e-10, 184 3.3316744e-10, 3.3584938e-10, 3.3854083e-10, 3.4124212e-10, 185 3.4395342e-10, 3.46675e-10, 3.4940711e-10, 3.5215003e-10, 186 3.5490397e-10, 3.5766917e-10, 3.6044595e-10, 3.6323455e-10, 187 3.660352e-10, 3.6884823e-10, 3.7167386e-10, 3.745124e-10, 188 3.773641e-10, 3.802293e-10, 3.8310827e-10, 3.860013e-10, 189 3.8890866e-10, 3.918307e-10, 3.9476775e-10, 3.9772008e-10, 190 4.0068804e-10, 4.0367196e-10, 4.0667217e-10, 4.09689e-10, 191 4.1272286e-10, 4.1577405e-10, 4.1884296e-10, 4.2192994e-10, 192 4.250354e-10, 4.281597e-10, 4.313033e-10, 4.3446652e-10, 193 4.3764986e-10, 4.408537e-10, 4.4407847e-10, 4.4732465e-10, 194 4.5059267e-10, 4.5388301e-10, 4.571962e-10, 4.6053267e-10, 195 4.6389292e-10, 4.6727755e-10, 4.70687e-10, 4.741219e-10, 196 4.7758275e-10, 4.810702e-10, 4.845848e-10, 4.8812715e-10, 197 4.9169796e-10, 4.9529775e-10, 4.989273e-10, 5.0258725e-10, 198 5.0627835e-10, 5.100013e-10, 5.1375687e-10, 5.1754584e-10, 199 5.21369e-10, 5.2522725e-10, 5.2912136e-10, 5.330522e-10, 200 5.370208e-10, 5.4102806e-10, 5.45075e-10, 5.491625e-10, 201 5.532918e-10, 5.5746385e-10, 5.616799e-10, 5.6594107e-10, 202 5.7024857e-10, 5.746037e-10, 5.7900773e-10, 5.834621e-10, 203 5.8796823e-10, 5.925276e-10, 5.971417e-10, 6.018122e-10, 204 6.065408e-10, 6.113292e-10, 6.1617933e-10, 6.2109295e-10, 205 6.260722e-10, 6.3111916e-10, 6.3623595e-10, 6.4142497e-10, 206 6.4668854e-10, 6.5202926e-10, 6.5744976e-10, 6.6295286e-10, 207 6.6854156e-10, 6.742188e-10, 6.79988e-10, 6.858526e-10, 208 6.9181616e-10, 6.978826e-10, 7.04056e-10, 7.103407e-10, 209 7.167412e-10, 7.2326256e-10, 7.2990985e-10, 7.366886e-10, 210 7.4360473e-10, 7.5066453e-10, 7.5787476e-10, 7.6524265e-10, 211 7.7277595e-10, 7.80483e-10, 7.883728e-10, 7.9645507e-10, 212 8.047402e-10, 8.1323964e-10, 8.219657e-10, 8.309319e-10, 213 8.401528e-10, 8.496445e-10, 8.594247e-10, 8.6951274e-10, 214 8.799301e-10, 8.9070046e-10, 9.018503e-10, 9.134092e-10, 215 9.254101e-10, 9.378904e-10, 9.508923e-10, 9.644638e-10, 216 9.786603e-10, 9.935448e-10, 1.0091913e-09, 1.025686e-09, 217 1.0431306e-09, 1.0616465e-09, 1.08138e-09, 1.1025096e-09, 218 1.1252564e-09, 1.1498986e-09, 1.1767932e-09, 1.206409e-09, 219 1.2393786e-09, 1.276585e-09, 1.3193139e-09, 1.3695435e-09, 220 1.4305498e-09, 1.508365e-09, 1.6160854e-09, 1.7921248e-09, 221 } 222 var fe = [256]float32{ 223 1, 0.9381437, 0.90046996, 0.87170434, 0.8477855, 0.8269933, 224 0.8084217, 0.7915276, 0.77595687, 0.7614634, 0.7478686, 225 0.7350381, 0.72286767, 0.71127474, 0.70019263, 0.6895665, 226 0.67935055, 0.6695063, 0.66000086, 0.65080583, 0.6418967, 227 0.63325197, 0.6248527, 0.6166822, 0.60872537, 0.60096896, 228 0.5934009, 0.58601034, 0.5787874, 0.57172304, 0.5648092, 229 0.5580383, 0.5514034, 0.5448982, 0.5385169, 0.53225386, 230 0.5261042, 0.52006316, 0.5141264, 0.50828975, 0.5025495, 231 0.496902, 0.49134386, 0.485872, 0.48048335, 0.4751752, 232 0.46994483, 0.46478975, 0.45970762, 0.45469615, 0.44975325, 233 0.44487688, 0.44006512, 0.43531612, 0.43062815, 0.42599955, 234 0.42142874, 0.4169142, 0.41245446, 0.40804818, 0.403694, 235 0.3993907, 0.39513698, 0.39093173, 0.38677382, 0.38266218, 236 0.37859577, 0.37457356, 0.37059465, 0.3666581, 0.362763, 237 0.35890847, 0.35509375, 0.351318, 0.3475805, 0.34388044, 238 0.34021714, 0.3365899, 0.33299807, 0.32944095, 0.32591796, 239 0.3224285, 0.3189719, 0.31554767, 0.31215525, 0.30879408, 240 0.3054636, 0.3021634, 0.29889292, 0.2956517, 0.29243928, 241 0.28925523, 0.28609908, 0.28297043, 0.27986884, 0.27679393, 242 0.2737453, 0.2707226, 0.2677254, 0.26475343, 0.26180625, 243 0.25888354, 0.25598502, 0.2531103, 0.25025907, 0.24743107, 244 0.24462597, 0.24184346, 0.23908329, 0.23634516, 0.23362878, 245 0.23093392, 0.2282603, 0.22560766, 0.22297576, 0.22036438, 246 0.21777324, 0.21520215, 0.21265087, 0.21011916, 0.20760682, 247 0.20511365, 0.20263945, 0.20018397, 0.19774707, 0.19532852, 248 0.19292815, 0.19054577, 0.1881812, 0.18583426, 0.18350479, 249 0.1811926, 0.17889754, 0.17661946, 0.17435817, 0.17211354, 250 0.1698854, 0.16767362, 0.16547804, 0.16329853, 0.16113494, 251 0.15898713, 0.15685499, 0.15473837, 0.15263714, 0.15055119, 252 0.14848037, 0.14642459, 0.14438373, 0.14235765, 0.14034624, 253 0.13834943, 0.13636707, 0.13439907, 0.13244532, 0.13050574, 254 0.1285802, 0.12666863, 0.12477092, 0.12288698, 0.12101672, 255 0.119160056, 0.1173169, 0.115487166, 0.11367077, 0.11186763, 256 0.11007768, 0.10830083, 0.10653701, 0.10478614, 0.10304816, 257 0.101323, 0.09961058, 0.09791085, 0.09622374, 0.09454919, 258 0.09288713, 0.091237515, 0.08960028, 0.087975375, 0.08636274, 259 0.08476233, 0.083174095, 0.081597984, 0.08003395, 0.07848195, 260 0.076941945, 0.07541389, 0.07389775, 0.072393484, 0.07090106, 261 0.069420435, 0.06795159, 0.066494495, 0.06504912, 0.063615434, 262 0.062193416, 0.060783047, 0.059384305, 0.057997175, 263 0.05662164, 0.05525769, 0.053905312, 0.052564494, 0.051235236, 264 0.049917534, 0.048611384, 0.047316793, 0.046033762, 0.0447623, 265 0.043502413, 0.042254124, 0.041017443, 0.039792392, 266 0.038578995, 0.037377283, 0.036187284, 0.035009038, 267 0.033842582, 0.032687962, 0.031545233, 0.030414443, 0.02929566, 268 0.02818895, 0.027094385, 0.026012046, 0.024942026, 0.023884421, 269 0.022839336, 0.021806888, 0.020787204, 0.019780423, 0.0187867, 270 0.0178062, 0.016839107, 0.015885621, 0.014945968, 0.014020392, 271 0.013109165, 0.012212592, 0.011331013, 0.01046481, 0.009614414, 272 0.008780315, 0.007963077, 0.0071633533, 0.006381906, 273 0.0056196423, 0.0048776558, 0.004157295, 0.0034602648, 274 0.0027887989, 0.0021459677, 0.0015362998, 0.0009672693, 275 0.00045413437, 276 } 277 278 // Float64 returns, as a float64, a pseudo-random number in the half-open interval [0.0,1.0). 279 func Float64() float64 { 280 // A clearer, simpler implementation would be: 281 // return float64(r.Int63n(1<<53)) / (1<<53) 282 // However, Go 1 shipped with 283 // return float64(r.Int63()) / (1 << 63) 284 // and we want to preserve that value stream. 285 // 286 // There is one bug in the value stream: r.Int63() may be so close 287 // to 1<<63 that the division rounds up to 1.0, and we've guaranteed 288 // that the result is always less than 1.0. 289 // 290 // We tried to fix this by mapping 1.0 back to 0.0, but since float64 291 // values near 0 are much denser than near 1, mapping 1 to 0 caused 292 // a theoretically significant overshoot in the probability of returning 0. 293 // Instead of that, if we round up to 1, just try again. 294 // Getting 1 only happens 1/2⁵³ of the time, so most clients 295 // will not observe it anyway. 296 again: 297 f := float64(Int63()) / (1 << 63) 298 if f == 1 { 299 goto again // resample; this branch is taken O(never) 300 } 301 return f 302 } 303 304 // Float32 returns, as a float32, a pseudo-random number in the half-open interval [0.0,1.0). 305 func Float32() float32 { 306 // Same rationale as in Float64: we want to preserve the Go 1 value 307 // stream except we want to fix it not to return 1.0 308 // This only happens 1/2²⁴ of the time (plus the 1/2⁵³ of the time in Float64). 309 again: 310 f := float32(Float64()) 311 if f == 1 { 312 goto again // resample; this branch is taken O(very rarely) 313 } 314 return f 315 } 316 317 // Int returns a non-negative pseudo-random int. 318 func Int() int { 319 u := uint(Int63()) 320 return int(u << 1 >> 1) // clear sign bit if int == int32 321 } 322 323 // Intn returns, as an int, a non-negative pseudo-random number in the half-open interval [0,n). 324 // It panics if n <= 0. 325 func Intn(n int) int { 326 if n <= 0 { 327 panic("invalid argument to Intn") 328 } 329 if n <= 1<<31-1 { 330 return int(Int31n(int32(n))) 331 } 332 return int(Int63n(int64(n))) 333 } 334 335 // NormFloat64 returns a normally distributed float64 in 336 // the range -math.MaxFloat64 through +math.MaxFloat64 inclusive, 337 // with standard normal distribution (mean = 0, stddev = 1). 338 // To produce a different normal distribution, callers can 339 // adjust the output using: 340 // 341 // sample = NormFloat64() * desiredStdDev + desiredMean 342 func NormFloat64() float64 { 343 for { 344 j := int32(Uint32()) // Possibly negative 345 i := j & 0x7F 346 x := float64(j) * float64(wn[i]) 347 if absInt32(j) < kn[i] { 348 // This case should be hit better than 99% of the time. 349 return x 350 } 351 352 if i == 0 { 353 // This extra work is only required for the base strip. 354 for { 355 x = -math.Log(Float64()) * (1.0 / rn) 356 y := -math.Log(Float64()) 357 if y+y >= x*x { 358 break 359 } 360 } 361 if j > 0 { 362 return rn + x 363 } 364 return -rn - x 365 } 366 if fn[i]+float32(Float64())*(fn[i-1]-fn[i]) < float32(math.Exp(-.5*x*x)) { 367 return x 368 } 369 } 370 } 371 372 var kn = [128]uint32{ 373 0x76ad2212, 0x0, 0x600f1b53, 0x6ce447a6, 0x725b46a2, 374 0x7560051d, 0x774921eb, 0x789a25bd, 0x799045c3, 0x7a4bce5d, 375 0x7adf629f, 0x7b5682a6, 0x7bb8a8c6, 0x7c0ae722, 0x7c50cce7, 376 0x7c8cec5b, 0x7cc12cd6, 0x7ceefed2, 0x7d177e0b, 0x7d3b8883, 377 0x7d5bce6c, 0x7d78dd64, 0x7d932886, 0x7dab0e57, 0x7dc0dd30, 378 0x7dd4d688, 0x7de73185, 0x7df81cea, 0x7e07c0a3, 0x7e163efa, 379 0x7e23b587, 0x7e303dfd, 0x7e3beec2, 0x7e46db77, 0x7e51155d, 380 0x7e5aabb3, 0x7e63abf7, 0x7e6c222c, 0x7e741906, 0x7e7b9a18, 381 0x7e82adfa, 0x7e895c63, 0x7e8fac4b, 0x7e95a3fb, 0x7e9b4924, 382 0x7ea0a0ef, 0x7ea5b00d, 0x7eaa7ac3, 0x7eaf04f3, 0x7eb3522a, 383 0x7eb765a5, 0x7ebb4259, 0x7ebeeafd, 0x7ec2620a, 0x7ec5a9c4, 384 0x7ec8c441, 0x7ecbb365, 0x7ece78ed, 0x7ed11671, 0x7ed38d62, 385 0x7ed5df12, 0x7ed80cb4, 0x7eda175c, 0x7edc0005, 0x7eddc78e, 386 0x7edf6ebf, 0x7ee0f647, 0x7ee25ebe, 0x7ee3a8a9, 0x7ee4d473, 387 0x7ee5e276, 0x7ee6d2f5, 0x7ee7a620, 0x7ee85c10, 0x7ee8f4cd, 388 0x7ee97047, 0x7ee9ce59, 0x7eea0eca, 0x7eea3147, 0x7eea3568, 389 0x7eea1aab, 0x7ee9e071, 0x7ee98602, 0x7ee90a88, 0x7ee86d08, 390 0x7ee7ac6a, 0x7ee6c769, 0x7ee5bc9c, 0x7ee48a67, 0x7ee32efc, 391 0x7ee1a857, 0x7edff42f, 0x7ede0ffa, 0x7edbf8d9, 0x7ed9ab94, 392 0x7ed7248d, 0x7ed45fae, 0x7ed1585c, 0x7ece095f, 0x7eca6ccb, 393 0x7ec67be2, 0x7ec22eee, 0x7ebd7d1a, 0x7eb85c35, 0x7eb2c075, 394 0x7eac9c20, 0x7ea5df27, 0x7e9e769f, 0x7e964c16, 0x7e8d44ba, 395 0x7e834033, 0x7e781728, 0x7e6b9933, 0x7e5d8a1a, 0x7e4d9ded, 396 0x7e3b737a, 0x7e268c2f, 0x7e0e3ff5, 0x7df1aa5d, 0x7dcf8c72, 397 0x7da61a1e, 0x7d72a0fb, 0x7d30e097, 0x7cd9b4ab, 0x7c600f1a, 398 0x7ba90bdc, 0x7a722176, 0x77d664e5, 399 } 400 var wn = [128]float32{ 401 1.7290405e-09, 1.2680929e-10, 1.6897518e-10, 1.9862688e-10, 402 2.2232431e-10, 2.4244937e-10, 2.601613e-10, 2.7611988e-10, 403 2.9073963e-10, 3.042997e-10, 3.1699796e-10, 3.289802e-10, 404 3.4035738e-10, 3.5121603e-10, 3.616251e-10, 3.7164058e-10, 405 3.8130857e-10, 3.9066758e-10, 3.9975012e-10, 4.08584e-10, 406 4.1719309e-10, 4.2559822e-10, 4.338176e-10, 4.418672e-10, 407 4.497613e-10, 4.5751258e-10, 4.651324e-10, 4.7263105e-10, 408 4.8001775e-10, 4.87301e-10, 4.944885e-10, 5.015873e-10, 409 5.0860405e-10, 5.155446e-10, 5.2241467e-10, 5.2921934e-10, 410 5.359635e-10, 5.426517e-10, 5.4928817e-10, 5.5587696e-10, 411 5.624219e-10, 5.6892646e-10, 5.753941e-10, 5.818282e-10, 412 5.882317e-10, 5.946077e-10, 6.00959e-10, 6.072884e-10, 413 6.135985e-10, 6.19892e-10, 6.2617134e-10, 6.3243905e-10, 414 6.386974e-10, 6.449488e-10, 6.511956e-10, 6.5744005e-10, 415 6.6368433e-10, 6.699307e-10, 6.7618144e-10, 6.824387e-10, 416 6.8870465e-10, 6.949815e-10, 7.012715e-10, 7.075768e-10, 417 7.1389966e-10, 7.202424e-10, 7.266073e-10, 7.329966e-10, 418 7.394128e-10, 7.4585826e-10, 7.5233547e-10, 7.58847e-10, 419 7.653954e-10, 7.719835e-10, 7.7861395e-10, 7.852897e-10, 420 7.920138e-10, 7.987892e-10, 8.0561924e-10, 8.125073e-10, 421 8.194569e-10, 8.2647167e-10, 8.3355556e-10, 8.407127e-10, 422 8.479473e-10, 8.55264e-10, 8.6266755e-10, 8.7016316e-10, 423 8.777562e-10, 8.8545243e-10, 8.932582e-10, 9.0117996e-10, 424 9.09225e-10, 9.174008e-10, 9.2571584e-10, 9.341788e-10, 425 9.427997e-10, 9.515889e-10, 9.605579e-10, 9.697193e-10, 426 9.790869e-10, 9.88676e-10, 9.985036e-10, 1.0085882e-09, 427 1.0189509e-09, 1.0296151e-09, 1.0406069e-09, 1.0519566e-09, 428 1.063698e-09, 1.0758702e-09, 1.0885183e-09, 1.1016947e-09, 429 1.1154611e-09, 1.1298902e-09, 1.1450696e-09, 1.1611052e-09, 430 1.1781276e-09, 1.1962995e-09, 1.2158287e-09, 1.2369856e-09, 431 1.2601323e-09, 1.2857697e-09, 1.3146202e-09, 1.347784e-09, 432 1.3870636e-09, 1.4357403e-09, 1.5008659e-09, 1.6030948e-09, 433 } 434 var fn = [128]float32{ 435 1, 0.9635997, 0.9362827, 0.9130436, 0.89228165, 0.87324303, 436 0.8555006, 0.8387836, 0.8229072, 0.8077383, 0.793177, 437 0.7791461, 0.7655842, 0.7524416, 0.73967725, 0.7272569, 438 0.7151515, 0.7033361, 0.69178915, 0.68049186, 0.6694277, 439 0.658582, 0.6479418, 0.63749546, 0.6272325, 0.6171434, 440 0.6072195, 0.5974532, 0.58783704, 0.5783647, 0.56903, 441 0.5598274, 0.5507518, 0.54179835, 0.5329627, 0.52424055, 442 0.5156282, 0.50712204, 0.49871865, 0.49041483, 0.48220766, 443 0.4740943, 0.46607214, 0.4581387, 0.45029163, 0.44252872, 444 0.43484783, 0.427247, 0.41972435, 0.41227803, 0.40490642, 445 0.39760786, 0.3903808, 0.3832238, 0.37613547, 0.36911446, 446 0.3621595, 0.35526937, 0.34844297, 0.34167916, 0.33497685, 447 0.3283351, 0.3217529, 0.3152294, 0.30876362, 0.30235484, 448 0.29600215, 0.28970486, 0.2834622, 0.2772735, 0.27113807, 449 0.2650553, 0.25902456, 0.2530453, 0.24711695, 0.241239, 450 0.23541094, 0.22963232, 0.2239027, 0.21822165, 0.21258877, 451 0.20700371, 0.20146611, 0.19597565, 0.19053204, 0.18513499, 452 0.17978427, 0.17447963, 0.1692209, 0.16400786, 0.15884037, 453 0.15371831, 0.14864157, 0.14361008, 0.13862377, 0.13368265, 454 0.12878671, 0.12393598, 0.119130544, 0.11437051, 0.10965602, 455 0.104987256, 0.10036444, 0.095787846, 0.0912578, 0.08677467, 456 0.0823389, 0.077950984, 0.073611505, 0.06932112, 0.06508058, 457 0.06089077, 0.056752663, 0.0526674, 0.048636295, 0.044660863, 458 0.040742867, 0.03688439, 0.033087887, 0.029356318, 459 0.025693292, 0.022103304, 0.018592102, 0.015167298, 460 0.011839478, 0.008624485, 0.005548995, 0.0026696292, 461 } 462 463 func absInt32(i int32) uint32 { 464 if i < 0 { 465 return uint32(-i) 466 } 467 return uint32(i) 468 } 469 470 // Perm returns, as a slice of n ints, a pseudo-random permutation of the integers 471 // in the half-open interval [0,n). 472 func Perm(n int) []int { 473 m := make([]int, n) 474 // In the following loop, the iteration when i=0 always swaps m[0] with m[0]. 475 // A change to remove this useless iteration is to assign 1 to i in the init 476 // statement. But Perm also effects r. Making this change will affect 477 // the final state of r. So this change can't be made for compatibility 478 // reasons for Go 1. 479 for i := 0; i < n; i++ { 480 j := Intn(i + 1) 481 m[i] = m[j] 482 m[j] = i 483 } 484 return m 485 }