最近想实现一个带概率控制的随机数,描述如下:
uint32 data。
data 在下列范围随机:
0~15(出现的概率为50%),16~31(出现的概率为20%),32~64(出现的概率为20%),64~128(出现的概率为10%)
请问如何方便地实现?
有没有标准库的package支持呢?
谢谢!
更多评论
import (
"crypto/rand"
"fmt"
"math/big"
)
func nrand(l int64) uint32 {
max := big.NewInt(l)
bigx, _ := rand.Int(rand.Reader, max)
x := bigx.Int64()
return uint32(x)
}
func genNumber() uint32{
g := nrand(100)
if g < 50 {
return nrand(16)
}
if g < 70 {
return 16 + nrand(16)
}
if g < 90 {
return 32 + nrand(32)
}
return 64 + nrand(64)
}
func main(){
var p0, p1 ,p2 ,p3 []uint32
for i:= 0 ; i< 1000 ; i++ {
g := genNumber()
if g < 16 {
p0 = append(p0, g)
continue
}
if g < 32 {
p1 = append(p1,g)
continue
}
if g < 64 {
p2 = append(p2,g)
continue
}
p3 = append(p3,g)
}
fmt.Printf("0~15 %v\n", len(p0))
fmt.Printf("16~32 %v\n", len(p1))
fmt.Printf("32~64 %v\n", len(p2))
fmt.Printf("64~128 %v\n", len(p3))
}
#1