思想:利用random(0,1)去构造二进制切片,然后再化为十进制数字。
复杂度: O(lg(b-a))
以下是代码:
package main
import (
"fmt"
"math"
"math/rand"
"time"
)
func randomAtoB(a, b int) int {
s1 := rand.NewSource(time.Now().UnixNano())
r1 := rand.New(s1)
if b < a {
a, b = b, a
}
len := int(math.Ceil(math.Log2(float64(b) - float64(a)))) //二进制切片的长度
arr := make([]int, len)
for {
resultNum := 0 //十进制的数字
for i := 0; i < len; i++ {
arr[i] = r1.Intn(2)
resultNum += arr[i] * int(math.Pow(2, float64(i)))
}
if resultNum >= 0 && resultNum <= b-a {
return (a + resultNum)
}
}
}
func main() {
fmt.Println(randomAtoB(3, 11))
}
网友评论