code: func csprngUint32n(csprng io.Reader, n uint32) (uint32, error) {
  	v, err := csprngUint32(csprng)
  	if err != nil {
  		return 0, err
  	}
  	prod := uint64(v) * uint64(n)
  	low := uint32(prod)
  	if low < n {
  		thresh := -n % n
  		for low < thresh {
  			v, err = csprngUint32(csprng)
  			if err != nil {
  				return 0, err
  			}
  			prod = uint64(v) * uint64(n)
  			low = uint32(prod)
  		}
  	}
  	return uint32(prod >> 32), nil
  }
docs: // csprngUint32n, given a CSPRNG, returns, as a uint32, a uniformly
  // distributed random number in [0, n). It is adapted from
  // math/rand.int31n from go 1.10.
  //
  // For implementation details, see:
  // https://lemire.me/blog/2016/06/27/a-fast-alternative-to-the-modulo-reduction
  // https://lemire.me/blog/2016/06/30/fast-random-shuffling