Initial cloud-services repo - gateway service + pkg modules
This commit is contained in:
49
pkg/utils/mt19937/uniform_int_distribution.go
Normal file
49
pkg/utils/mt19937/uniform_int_distribution.go
Normal file
@@ -0,0 +1,49 @@
|
||||
package mt19937
|
||||
|
||||
import (
|
||||
"log"
|
||||
)
|
||||
|
||||
type UniformIntDistribution struct {
|
||||
m_min int64
|
||||
m_max int64
|
||||
m_eng *MT19937
|
||||
}
|
||||
|
||||
func DistInt64(eng *MT19937, begin int64, end int64) *UniformIntDistribution {
|
||||
if begin > end {
|
||||
log.Println("ERROR! begin is not allowed to be greater than end!")
|
||||
return nil
|
||||
}
|
||||
|
||||
dist := &UniformIntDistribution{
|
||||
m_min: begin,
|
||||
m_max: end,
|
||||
m_eng: eng,
|
||||
}
|
||||
return dist
|
||||
}
|
||||
|
||||
func (dist *UniformIntDistribution) Int64() int64 {
|
||||
var rng uint64
|
||||
|
||||
if dist.m_min >= 0 {
|
||||
rng = uint64(dist.m_max) - uint64(dist.m_min)
|
||||
} else if dist.m_max >= 0 {
|
||||
rng = uint64(dist.m_max) + uint64(-(dist.m_min + 1)) + 1
|
||||
} else {
|
||||
rng = uint64(dist.m_max - dist.m_min)
|
||||
}
|
||||
|
||||
if rng == 0 {
|
||||
return dist.m_min
|
||||
} else if rng == ^uint64(0) {
|
||||
return int64(dist.m_eng.Random())
|
||||
}
|
||||
bucket_size := ^uint64(0) / (rng + 1)
|
||||
if ^uint64(0)%(rng+1) == rng {
|
||||
bucket_size++
|
||||
}
|
||||
result := dist.m_eng.Random() / bucket_size
|
||||
return int64(result) + dist.m_min
|
||||
}
|
||||
Reference in New Issue
Block a user