Xquery结果重复

Xquery结果重复,xquery,Xquery,我没有得到我想要的输出。我不明白为什么结果会重复。有人能帮我吗 for $i in 1 to 2 let $rng:=random-number-generator() let $rng1:=$rng('permute')(1 to 10) let $rng:=$rng('next')() let $rng2:=$rng('permute')(1 to 10) let $rng:=$rng('next')() let $rng3:=$rng('permute')(1 to 10) retu

我没有得到我想要的输出。我不明白为什么结果会重复。有人能帮我吗

for $i in 1 to 2
let $rng:=random-number-generator()
let $rng1:=$rng('permute')(1 to 10)

let $rng:=$rng('next')()
let $rng2:=$rng('permute')(1 to 10)

let $rng:=$rng('next')()
let $rng3:=$rng('permute')(1 to 10)

return (string-join($rng1),string-join($rng2),string-join($rng3),",")

result:
23496815107
31018674529
31017684259

23496815107
31018674529
31017684259

由于1到2中$i的初始值
,以及变量
$i
实际上没有在任何地方使用,因此结果是重复的

我根据你的评论编辑了这个查询(得到10个数字)。据我所知,这里的困难是链接调用(交替使用“下一步”和“置换”)。链接调用可以通过尾部递归完成

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个数字。毫无疑问,我没有改变它

我想我现在明白是什么让你在最初的问题中困惑了。对于$i的每次迭代,人们确实可以期望生成不同的随机数

然而,XQuery(简单地说,除了少数例外)是确定性的。这意味着随机生成器可能在每次迭代中使用相同的默认种子进行初始化

因此,我有第二个可能的答案:


如果您有办法将不同的seed传递给$rng,那么您可以在生成数字之前,通过在每次迭代中基于$i和current-dateTime()构造seed来稍微修改初始查询。但是,如果多次执行查询,结果仍然相同,除非涉及当前日期/时间。

规范如下:

它说:

函数的两种形式都是确定性的:调用函数 两次使用相同的参数,在一个·执行范围内·, 产生相同的结果


如果将
$i
作为
$seed
参数提供给随机数生成器,则这两个序列应该不同。

您使用的是什么XQuery引擎?许多函数提供随机数函数和模块:random-number-generator()是XQuery 3.1中的标准函数。链接调用的另一种方法是使用fold left:
fold left(1到10,random-number-generator(),函数($z,$i){head($z)('next')(),tail($z),head('number')}=>tail()
谢谢你,迈克!确实要简洁得多。哇,我错过了这个标准化了。这是对3.1的一个很好的补充。