我没有得到我想要的输出。我不明白为什么结果重复。有人能帮助我吗?
4 + 4
答案 0 :(得分:1)
结果因初始for $i in 1 to 2
而重复,因为变量$i
实际上并未在任何地方使用。
我根据您的评论编辑了查询(获得10个数字)。根据我的理解,这里的困难是将呼叫链接起来(在下一个'和#39; permute'之间交替)。链接调用可以通过尾递归来完成。
declare function local:multiple-calls(
$rng as function(*),
$number-of-times as xs:integer) as item()* {
if($number-of-times le 0)
then ()
else
let $rng := $rng('next')
return ($rng('permute')(1 to 10),
local:multiple-calls($rng, $number-of-times - 1))
};
local:multiple-calls(random-number-generator(), 10)
注意:我不确定(1到10)是否需要实际传递给$ rng(' permute')的调用,或者是否尝试输出10个数字。有疑问,我没有改变它。
答案 1 :(得分:1)
规范在这里:
http://www.w3.org/TR/xpath-functions-31/#func-random-number-generator
它说:
这两种形式的函数都是确定性的:调用函数 在单个执行范围内,具有相同参数的两次· 产生相同的结果。
如果您将$i
作为$seed
参数提供给random-number-generator,那么这两个序列应该是不同的。
答案 2 :(得分:0)
我想我现在明白在原始查询中会让您感到困惑的是什么。人们确实可以预期,每次迭代$ i都会以不同的方式生成随机数。
然而,XQuery(简单地说,除了少数例外)是确定性的。这意味着随机生成器可能在每次迭代中使用相同的默认种子进行初始化。
因此,我有第二个可能的答案:
如果你有办法将不同的种子传递给$ rng,你可以通过在生成数字之前在每次迭代中构建基于$ i和可能current-dateTime()的种子来稍微修改初始查询。但如果您多次执行查询,除非涉及当前日期/时间,否则它仍然是相同的。