HUGO
News Docs Themes Community GitHub

collections.D

Returns a sorted slice of unique random integers.

Syntax

collections.D SEED N HIGH

Returns

[]int
New in v0.149.0

The collections.D function returns a sorted slice of unique random integers in the half-open interval [0, HIGH) using the provided SEED value. The number of elements in the resulting slice is N or HIGH, whichever is less.

  • N and H must be integers in the closed interval [0, 1000000]
  • SEED must be an integer in the closed interval [0, 2^64 - 1]

Return values

ConditionReturn value
N <= HIGHA sorted random sample of size N using J. S. Vitter’s Method D for sequential random sampling
N > HIGHThe full, sorted range [0, HIGH) of size HIGH
N == 0An empty slice
N < 0Error
N > 10^6Error
HIGH == 0An empty slice
HIGH < 0Error
HIGH > 10^6Error
SEED < 0Error

Examples

{{ collections.D 6 7 42 }} → [4, 9, 10, 20, 22, 24, 41]

The example above generates the same random numbers each time it is called. To generate a different set of 7 random numbers in the same range, change the seed value.

{{ collections.D 2 7 42 }} → [3, 11, 19, 25, 32, 33, 38]

When N is greater than HIGH, this function returns the full, sorted range [0, HIGH) of size HIGH:

{{ collections.D 6 42 7 }} → [0 1 2 3 4 5 6]

A common use case is the selection of random pages from a page collection. For example, to render a list of 5 random pages using the day of the year as the seed value:

<ul>
  {{ $p := site.RegularPages }}
  {{ range collections.D time.Now.YearDay 5 ($p | len) }}
    {{ with (index $p .) }}
      <li><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></li>
    {{ end }}
  {{ end }}
</ul>

The construct above is significantly faster than using the collections.Shuffle function.

Seed value

Choosing an appropriate seed value depends on your objective.

ObjectiveSeed example
Consistent result42
Different result on each callint time.Now.UnixNano
Same result per daytime.Now.YearDay
Same result per pagehash.FNV32a .Path
Different result per page per dayhash.FNV32a (print .Path time.Now.YearDay)