最近想实现一个带概率控制的随机数,描述如下:
uint32 data。
data 在下列范围随机:
0~15(出现的概率为50%),16~31(出现的概率为20%),32~64(出现的概率为20%),64~128(出现的概率为10%)
请问如何方便地实现?
有没有标准库的package支持呢?
谢谢!
<a href="/user/254244460" title="@254244460">@254244460</a> 这个方式是可行的,只是描述的不清楚。首先第一次随机数在0~100之间的数据对应概率范围。比如,0~50之间的数对应50%的概率,51~70对应后20%的概率,70~90对应再后来的20%的概率,90~100之间的数字对应10%的概率,之后再根据概率区间随机生成对应的相应区间的数字。
#4
更多评论
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