mirror of
https://github.com/duke-git/lancet.git
synced 2025-09-26 19:41:20 +08:00
fix: fix the bug of random.RandFloats() infinite loop and the result of random.RandFloat() sometimes equals to max.
This commit is contained in:
@@ -126,12 +126,24 @@ func RandFloat(min, max float64, precision int) float64 {
|
|||||||
|
|
||||||
n := rand.Float64()*(max-min) + min
|
n := rand.Float64()*(max-min) + min
|
||||||
|
|
||||||
return mathutil.RoundToFloat(n, precision)
|
return mathutil.FloorToFloat(n, precision)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RandFloats generate a slice of random float64 numbers of length that do not repeat.
|
// RandFloats generate a slice of random float64 numbers of length that do not repeat.
|
||||||
// Play: https://go.dev/play/p/I3yndUQ-rhh
|
// Play: https://go.dev/play/p/I3yndUQ-rhh
|
||||||
func RandFloats(length int, min, max float64, precision int) []float64 {
|
func RandFloats(length int, min, max float64, precision int) []float64 {
|
||||||
|
if max < min {
|
||||||
|
min, max = max, min
|
||||||
|
}
|
||||||
|
|
||||||
|
maxLength := int((max - min) * math.Pow10(precision))
|
||||||
|
if maxLength == 0 {
|
||||||
|
maxLength = 1
|
||||||
|
}
|
||||||
|
if length > maxLength {
|
||||||
|
length = maxLength
|
||||||
|
}
|
||||||
|
|
||||||
nums := make([]float64, length)
|
nums := make([]float64, length)
|
||||||
used := make(map[float64]struct{}, length)
|
used := make(map[float64]struct{}, length)
|
||||||
for i := 0; i < length; {
|
for i := 0; i < length; {
|
||||||
|
@@ -197,6 +197,14 @@ func TestRandFloats(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
assert.Equal(len(numbers), 5)
|
assert.Equal(len(numbers), 5)
|
||||||
|
|
||||||
|
numbers2 := RandFloats(10, 3.14, 3.2, 2)
|
||||||
|
for _, n := range numbers2 {
|
||||||
|
assert.GreaterOrEqual(n, 3.14)
|
||||||
|
assert.Less(n, 3.2)
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.Equal(len(numbers2), 6)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRandIntSlice(t *testing.T) {
|
func TestRandIntSlice(t *testing.T) {
|
||||||
|
Reference in New Issue
Block a user