Random Marklogic:如何从序列中随机返回一组项目(随机样本)?

Random Marklogic:如何从序列中随机返回一组项目(随机样本)?,random,xquery,sequence,marklogic,Random,Xquery,Sequence,Marklogic,让我们假设我们有一个序列s:=('a','b','c','d','e')。我想返回一个随机样本,由这个序列中的三个项目组成。在Marklogic中如何做到这一点? 注意:我使用的序列就是一个例子。我处理的是大序列。一种可能的方法是使用递归函数重复提取单个值 declare function local:draw-n($sequence, $n) { if ($n > 0) then let $index := 1 + xdmp:random(count($sequence)

让我们假设我们有一个序列
s:=('a','b','c','d','e')
。我想返回一个随机样本,由这个序列中的三个项目组成。在Marklogic中如何做到这一点?
注意:我使用的序列就是一个例子。我处理的是大序列。

一种可能的方法是使用递归函数重复提取单个值

declare function local:draw-n($sequence, $n) {
  if ($n > 0)
  then
    let $index := 1 + xdmp:random(count($sequence))
    return ($sequence[$index], local:draw-n($sequence[
      position() < $index or position() > $index
    ], $n - 1))
  else
    ()
};

local:draw-n(('a','b','c','d','e'), 3)
declare function local:n-different-random-values($values, $n, $max) {
  if (count($values) eq $n)
  then $values
  else
    let $values := ($values, 1 + xdmp:random(count($sequence)))
    return local:n-different-random-values(distinct-values($values), $n, $max)
};

let $sequence := ('a','b','c','d','e')
let $indexes := local:n-different-random-values((), 3, count($sequence))
return $sequence[position() = $indexes]

因为我处理的是大序列,所以第二种方法对我有效。