// randomN creates a random integer in [0..limit), using the space in z if // possible. n is the bit length of limit. func randomN(z []Word, rand *rand.Rand, limit []Word, n int) []Word { bitLengthOfMSW := uint(n % _W) if bitLengthOfMSW == 0 { bitLengthOfMSW = _W } mask := Word((1 << bitLengthOfMSW) - 1) z = makeN(z, len(limit), false) for { for i := range z { switch _W { case 32: z[i] = Word(rand.Uint32()) case 64: z[i] = Word(rand.Uint32()) | Word(rand.Uint32())<<32 } } z[len(limit)-1] &= mask if cmpNN(z, limit) < 0 { break } } return normN(z) }
// random creates a random integer in [0..limit), using the space in z if // possible. n is the bit length of limit. func (z nat) random(rand *rand.Rand, limit nat, n int) nat { bitLengthOfMSW := uint(n % _W) if bitLengthOfMSW == 0 { bitLengthOfMSW = _W } mask := Word((1 << bitLengthOfMSW) - 1) z = z.make(len(limit)) for { for i := range z { switch _W { case 32: z[i] = Word(rand.Uint32()) case 64: z[i] = Word(rand.Uint32()) | Word(rand.Uint32())<<32 } } z[len(limit)-1] &= mask if z.cmp(limit) < 0 { break } } return z.norm() }
func randomInt(rand *rand.Rand) *big.Int { return new(big.Int).SetInt64(int64(int32(rand.Uint32()))) }