最近想实现一个带概率控制的随机数,描述如下: uint32 data。 data 在下列范围随机: 0~15(出现的概率为50%),16~31(出现的概率为20%),32~64(出现的概率为20%),64~128(出现的概率为10%)
请问如何方便地实现? 有没有标准库的package支持呢?
谢谢!
有疑问加站长微信联系(非本文作者)

最近想实现一个带概率控制的随机数,描述如下: uint32 data。 data 在下列范围随机: 0~15(出现的概率为50%),16~31(出现的概率为20%),32~64(出现的概率为20%),64~128(出现的概率为10%)
请问如何方便地实现? 有没有标准库的package支持呢?
谢谢!
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
`单行代码`
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)) }
很好看!!
两次随机,第一次随机范围0-100确定区间,第二次再确定具体的数值,比如第一次得到49,对应区间0-15,再随机0-15
@254244460 这个方式是可行的,只是描述的不清楚。首先第一次随机数在0~100之间的数据对应概率范围。比如,0~50之间的数对应50%的概率,51~70对应后20%的概率,70~90对应再后来的20%的概率,90~100之间的数字对应10%的概率,之后再根据概率区间随机生成对应的相应区间的数字。
谢谢!
谢谢!
gofmt