2016-08-13 4 views

答えて

4

可能な方法の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] 
+0

私は大きなシーケンスを扱っているので、2番目の方法は私のために働いた。 –

関連する問題