2017-01-11 17 views
1

私が望む出力が得られません。なぜ結果が重複しているのか分かりません。誰か助けてくれますか?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) 

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

result: 
23496815107 
31018674529 
31017684259 

23496815107 
31018674529 
31017684259 
+0

どのようなXQueryエンジンを使用していますか?多くは乱数関数とモジュールを提供しています:https://stackoverflow.com/questions/12086038/is-there-any-possibility-to-generate-random-numbers-using-xquery –

+0

乱数生成器()は標準ですXQuery 3.1の関数です。 –

答えて

1

結果があるため、最初のfor $i in 1 to 2で複製され、そして変数$iは実際にはどこでも使用されていないため。

あなたのコメント(10の数字を得る)に基づいてクエリを編集しました。私が理解しているところでは、ここでの難しさはコールを連鎖させることです( 'next'と '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)場合、私はわからないが、それは出力10の数字にしようとした場合、実際の$ RNG(「並び替える」)への呼び出しに渡された、またはする必要があるものです。疑いの余地は、私はそれを変更していない。

+1

コールをチェーンするもう1つの方法は、fold-leftを使うことです: 'fold-left(1から10までのランダム番号ジェネレータ()、function($ z、$ i){head($ z)( 'next') )、tail($ z)、head($ z)( 'number')} => tail() ' –

+0

ありがとう、マイク!確かにもっと簡潔です。 –

0

私はこの元のクエリであなたが混乱していることを理解していると思います。実際には、$ iの反復ごとに異なる数の乱数が生成されることが予想されます。

しかし、XQueryは、(いくつかの例外を除けば)単純に決定論的です。これは、おそらくランダムジェネレータが同じデフォルトシードで各繰り返しで初期化されることを意味します。

したがって、私は第2の電位の答えを持っている:

あなたは$のRNGに異なるシードを渡す方法を持っている場合、あなたは少し多分$ iとに基づいてシードを構築することで、あなたの最初のクエリを修正することができるの電流数値を生成する前に、各繰り返しでdateTime()を使用します。しかし、現在の日付/時刻が関与していない限り、クエリを何度も実行すると同じです。

1

仕様はここにある:

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

それは言う:機能の

どちらの形式である・決定論・:シングル以内に、同じ引数で二回機能 を呼び出します・実行範囲・ は同じ結果を生成します。

$i$seed random-number-generatorの引数として指定すると、2つのシーケンスが異なる必要があります。

+0

うわー、私はこれも標準化されていることを逃した。それは3.1に本当に素晴らしい追加です。 –

関連する問題