我有一个无符号的64位数字,代表尾数,或分数(代表从[0..1)
到0
的范围,其中0.0
映射到0
,0xffffff..
映射到"恰好在1.0之前"的数字)
现在我想把这个范围分成相等的buckets
-并回答-给定随机数key
,它将落到范围的哪一部分?
通过以下代码可以更轻松地获得:
func BucketIndex(key, buckets uint64) uint64 {
return uint64(float64(key) / ((math.Pow(2, 64) / float64(buckets)))
}
我的try 是将2^64一分为二,就像我要将范围缩小到32位一样,并在64位中进行运算以进行数学运算:
// ~=key / ((1 << 64) / buckets)
return ((key >> 32) * buckets) >> 32
但射程不再相等..
三分之一的人将达到0x5555555600000000
岁,而不是0x5555555555555556
岁
这是一个令人悲伤的故事,所以我问你有没有更好的方法来找到(1 << 64) / buckets
?