HUGO
News Docs Themes Community GitHub

collections.D

Returns a slice of sequentially ordered random integers.

Syntax

collections.D SEED N HIGH

Returns

[]int
New in v0.149.0

The collections.D function returns a slice of N sequentially ordered unique random integers in the half-open interval [0, HIGH) using the provided SEED value. This function implements J. S. Vitter’s Method D1 for sequential random sampling, a fast and efficient algorithm for this task.

See this article for a detailed explanation.

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]

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 calltime.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)

The slice created by this function is limited to 1 million elements.


  1. J. S. Vitter, “An efficient algorithm for sequential random sampling,” ACM Trans. Math. Soft., vol. 13, pp. 58–67, Mar. 1987. ↩︎