miller/pkg/bifs/random.go
Adam Lesperance 085e831668
The package version must match the major tag version (#1654)
* Update package version

* Update makefile targets

* Update readme packages

* Remaining old packages via rg/sd
2024-09-20 12:10:11 -04:00

87 lines
1.8 KiB
Go

package bifs
import (
"math"
"github.com/johnkerl/miller/v6/pkg/lib"
"github.com/johnkerl/miller/v6/pkg/mlrval"
)
func BIF_urand() *mlrval.Mlrval {
return mlrval.FromFloat(
lib.RandFloat64(),
)
}
func BIF_urand32() *mlrval.Mlrval {
return mlrval.FromInt(
int64(
lib.RandUint32(),
),
)
}
// TODO: use a disposition matrix
func BIF_urandint(input1, input2 *mlrval.Mlrval) *mlrval.Mlrval {
if !input1.IsLegit() {
return input1
}
if !input2.IsLegit() {
return input2
}
if !input1.IsInt() {
return mlrval.FromNotIntError("urandint", input1)
}
if !input2.IsInt() {
return mlrval.FromNotIntError("urandint", input2)
}
a := input1.AcquireIntValue()
b := input2.AcquireIntValue()
var lo int64 = 0
var hi int64 = 0
if a <= b {
lo = a
hi = b + 1
} else {
lo = b
hi = a + 1
}
u := int64(math.Floor(float64(lo) + float64((hi-lo))*lib.RandFloat64()))
return mlrval.FromInt(u)
}
func BIF_urandrange(input1, input2 *mlrval.Mlrval) *mlrval.Mlrval {
if !input1.IsLegit() {
return input1
}
if !input2.IsLegit() {
return input2
}
a, aok := input1.GetNumericToFloatValue()
b, bok := input2.GetNumericToFloatValue()
if !aok {
return mlrval.FromNotNumericError("urandrange", input1)
}
if !bok {
return mlrval.FromNotNumericError("urandrange", input2)
}
return mlrval.FromFloat(
a + (b-a)*lib.RandFloat64(),
)
}
func BIF_urandelement(input1 *mlrval.Mlrval) *mlrval.Mlrval {
arrayval := input1.GetArray()
if arrayval == nil { // not an array
return mlrval.FromNotArrayError("urandelement", input1)
}
if len(arrayval) == 0 {
return mlrval.FromErrorString("urandelement: received a zero-length array as input")
}
// lo is inclusive, hi is exclusive
index := lib.RandRange(0, int64(len(arrayval)))
return arrayval[index].Copy()
}