Marklogic:如何 return 从序列中随机抽取一组项目(随机样本)?
Marklogic: How to return a set of items from a sequence randomly (random sample)?
让我们假设我们有一个序列s:=('a','b','c','d','e')
。我想要 return 一个随机样本,该样本包含此序列中的三个项目。如何在 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)
虽然对于大序列可能有更有效的方法(例如生成三个随机数,确保它们不同并使用它们从序列中 select)。
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]
让我们假设我们有一个序列s:=('a','b','c','d','e')
。我想要 return 一个随机样本,该样本包含此序列中的三个项目。如何在 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)
虽然对于大序列可能有更有效的方法(例如生成三个随机数,确保它们不同并使用它们从序列中 select)。
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]