2
シーケンスがs:=('a','b','c','d','e')
であるとします。私は、このシーケンスから3つの項目からなるランダムサンプルを返したいと思います。 Marklogicでこれを行う方法は? 注:私が使用したシーケンスは一例です。私は大きなシーケンスを扱っています。Marklogic:シーケンスからランダムにアイテムのセットを返す方法(ランダムサンプル)?
シーケンスがs:=('a','b','c','d','e')
であるとします。私は、このシーケンスから3つの項目からなるランダムサンプルを返したいと思います。 Marklogicでこれを行う方法は? 注:私が使用したシーケンスは一例です。私は大きなシーケンスを扱っています。Marklogic:シーケンスからランダムにアイテムのセットを返す方法(ランダムサンプル)?
可能な方法の1つは、再帰関数を使用して1つの値を繰り返しプルすることです。
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)
はかかわらず、(それらが異なるなら確認して、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]
私は大きなシーケンスを扱っているので、2番目の方法は私のために働いた。 –