diff --git a/docs/content/en/functions/math/Rand.md b/docs/content/en/functions/math/Rand.md new file mode 100644 index 00000000000..4cdf02fd349 --- /dev/null +++ b/docs/content/en/functions/math/Rand.md @@ -0,0 +1,44 @@ +--- +title: math.Rand +description: Returns a pseudo-random number in the half-open interval [0.0, 1.0). +categories: [] +keywords: [] +action: + aliases: [] + related: [] + returnType: float64 + signatures: [math.Rand] +--- + +The `math.Rand` function returns a pseudo-random number in the [half-open interval] [0.0, 1.0). + +```go-html-template +{{ math.Rand }} → 0.6312770459590062 +``` + +To generate a random integer in the [closed interval] [0, 5]: + +```go-html-template +{{ math.Rand | mul 6 | math.Floor }} +``` + +To generate a random integer in the closed interval [1, 6]: + +```go-html-template +{{ math.Rand | mul 6 | math.Ceil }} +``` + +To generate a random float, with one digit after the decimal point, in the closed interval [0, 4.9]: + +```go-html-template +{{ div (math.Rand | mul 50 | math.Floor) 10 }} +``` + +To generate a random float, with one digit after the decimal point, in the closed interval [0.1, 5.0]: + +```go-html-template +{{ div (math.Rand | mul 50 | math.Ceil) 10 }} +``` + +[closed interval]: /getting-started/glossary/#interval +[half-open interval]: /getting-started/glossary/#interval diff --git a/docs/content/en/getting-started/glossary.md b/docs/content/en/getting-started/glossary.md index edf64ab8946..dce3d152796 100644 --- a/docs/content/en/getting-started/glossary.md +++ b/docs/content/en/getting-started/glossary.md @@ -147,6 +147,16 @@ A numeric data type without a fractional component. For example, `42`. Software design and development efforts that enable [localization](#localization). See the [W3C definition](https://www.w3.org/International/questions/qa-i18n). Abbreviated i18n. +###### interval + +An [interval](https://en.wikipedia.org/wiki/Interval_(mathematics)) is a range of numbers between two endpoints: closed, open, or half-open. + +- A _closed_ interval, denoted by brackets, includes its endpoints. For example, [0, 1] is the interval where `0 <= x <= 1`. + +- An _open_ interval, denoted by parenthesis, excludes its endpoints. For example, (0, 1) is the interval where `0 < x < 1`. + +- A _half-open_ interval includes only one of its endpoints. For example, (0, 1] is the _left-open_ interval where `0 < x <= 1`, while [0, 1) is the _right-open_ interval where `0 <= x < 1`. + ###### kind See [page kind](#page-kind). diff --git a/tpl/math/init.go b/tpl/math/init.go index 8596ff64705..fa136767176 100644 --- a/tpl/math/init.go +++ b/tpl/math/init.go @@ -115,6 +115,13 @@ func init() { }, ) + ns.AddMethodMapping(ctx.Rand, + nil, + [][2]string{ + {"{{ math.Rand }}", "0.6312770459590062"}, + }, + ) + ns.AddMethodMapping(ctx.Round, nil, [][2]string{ diff --git a/tpl/math/math.go b/tpl/math/math.go index a921bd7ada3..0f8db11e2a8 100644 --- a/tpl/math/math.go +++ b/tpl/math/math.go @@ -18,6 +18,7 @@ import ( "errors" "fmt" "math" + "math/rand" "reflect" "sync/atomic" @@ -157,6 +158,11 @@ func (ns *Namespace) Pow(n1, n2 any) (float64, error) { return math.Pow(af, bf), nil } +// Rand returns, as a float64, a pseudo-random number in the half-open interval [0.0,1.0). +func (ns *Namespace) Rand() float64 { + return rand.Float64() +} + // Round returns the integer nearest to n, rounding half away from zero. func (ns *Namespace) Round(n any) (float64, error) { xf, err := cast.ToFloat64E(n) diff --git a/tpl/tplimpl/template_funcs_test.go b/tpl/tplimpl/template_funcs_test.go index 9cc84934b9f..f1ab3d65959 100644 --- a/tpl/tplimpl/template_funcs_test.go +++ b/tpl/tplimpl/template_funcs_test.go @@ -61,12 +61,10 @@ title: "**BatMan**" ns := nsf(d) for _, mm := range ns.MethodMappings { for _, example := range mm.Examples { - if strings.Contains(example[0], "errorf") { - // This will fail the build, so skip for now. - continue - } - if strings.Contains(example[0], "transform.XMLEscape") { - // This will fail the build, so skip for now. + // These will fail the build, so skip. + if strings.Contains(example[0], "errorf") || + strings.Contains(example[0], "transform.XMLEscape") || + strings.Contains(example[0], "math.Rand") { continue } templates = append(templates, example[0])