mirror of
https://github.com/johnkerl/miller.git
synced 2026-01-23 02:14:13 +00:00
* Update package version * Update makefile targets * Update readme packages * Remaining old packages via rg/sd
87 lines
1.8 KiB
Go
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()
|
|
}
|