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  }