There are a couple of ways to achieve this.

You can write a shuffle function in Ruby, take a copy of the input array and return a shuffled copy using Fischer-Yate algorithm.

Or write in Puppet using random numbers and sorting.

Create an array of equal length of the original, containing tuples of value and a *unique* random number. This array is then sorted on the random value. Here as how that can be done:


function shuffle($original) {
generate_unique_random(size($original))
  .map() |$i, $random | { [$random, $original[$i]] }
  .sort() |$a, $b| { compare($a[0], $b[0])}
  .map() |$pair| { $pair[1] }
}

['blue', 'red', 'green'].shuffle.notice()


Now you need to write the unique random function. This is a bit difficult in puppet as there is no unbound iteration (worst case you could have a very long series of exactly the same value). What you can do however is generate more values (with a wide spread), unique them and then slice them to the desires size. Here I multiply by 3 and spread result over 100000.

function generate_unique_random($size) {
  ($size * 3).map |$seed| {
    fqdn_rand(100000 * $size, $seed)}
  .unique()[0, $size]
}

Output from the above:

  Notice: Scope(Class[main]): [red, blue, green]

The shuffle is stable per node (you always get the same result).

Hope that helps
- henrik

On 2020-06-10 13:12, Albert Shih wrote:
Hi everyone

I try to do a very simple shuffle in a array but I need the shuffle to by
repeatable like fqdn_rand.

In any other langage it's seem very simple to do a Fischer-Yate but only
with map/reduce like I cannot figure out how to do that.

Regards.

--
Albert SHIH
Observatoire de Paris
Heure local/Local time:
Wed 10 Jun 2020 01:07:12 PM CEST



--

Visit my Blog "Puppet on the Edge"
http://puppet-on-the-edge.blogspot.se/

--
You received this message because you are subscribed to the Google Groups "Puppet 
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to puppet-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/puppet-users/rbu1kq%242f8c%241%40ciao.gmane.io.

Reply via email to