首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复制Xquery结果

复制Xquery结果
EN

Stack Overflow用户
提问于 2017-01-11 08:35:29
回答 3查看 125关注 0票数 1

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

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-11 08:41:52

结果是重复的,因为初始的for $i in 1 to 2,以及变量$i实际上没有在任何地方使用。

我根据您的评论(得到10个数字)编辑了查询。据我所知,这里的困难是连锁呼叫(在“next”和“permute”之间交替)。链接调用可以通过尾递归来完成。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-01-12 09:29:19

规格如下:

http://www.w3.org/TR/xpath-functions-31/#func-random-number-generator

上面写着:

这两种形式的函数都是.确定性的.:在单个.执行范围内用相同的参数调用函数两次,得到相同的结果。

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

票数 1
EN

Stack Overflow用户

发布于 2017-01-11 20:05:18

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

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

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

如果您有一种方法将一个不同的种子传递给$rng,那么您可以通过在每次迭代中构造一个基于$i的种子,或者在每次迭代中构建一个种子,在生成数字之前稍微修改您的初始查询。但是,如果您多次执行查询,除非涉及当前日期/时间,否则仍然是相同的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41586069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档