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

时间:2016-08-13 10:02:31

标签: random xquery sequence marklogic

我们假设我们有一个序列$(document).ready(function(){ var buttons = $(".container button"); if(buttons.length > 0){ buttons[0].on("click", function(){ //this will return two modals var modals = $(".container div.modal") if(modals.length > 0){ modals[0].modal("toggle"); } }) } if(buttons.length > 1){ buttons[1].on("click", function(){ //this will return two modals var modals = $(".container div.modal") if(modals.length > 1){ modals[1].modal("toggle"); } }) } }) 。我想返回一个由此序列中的三个项组成的随机样本。如何在Marklogic中这样做? 注意:我使用的序列就是一个例子。我正在处理大序列。

1 个答案:

答案 0 :(得分:4)

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

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]