2016-11-22 1 views
1

私は自分のアプリケーションの1つでGKShuffledDistributionを使用しようとしていますが、nextInt(upperBound :)メソッドはnextIntメソッドと同じように動作しません。デモを行うには、遊び場を開いて次の操作を行います。GKShuffledDistribution - upperboundを使用してもすべての可能な値を使い果たしていませんか?

import GameplayKit 
let shuffled = GKShuffledDistribution.init(lowestValue: 0, highestValue: 100) 

for _ in 0...25{ 
    shuffled.nextInt(upperBound: 100) 
} 

このメソッドを使用して2つの複製を取得しました。私がそれを置き換えた場合:

shuffled.nextInt() 

私は重複を取得しません。これはnextInt(upperBound :)が動作する方法ですか?そうであれば、これを説明する文書を私に指摘する人もいますか?ありがとう。

答えて

1

upperBoundは、あなたのGKShuffledDistributionインスタンスを作成するときに設定したhighestValue未満だあなたlowestValueと新しい(一時的な)highestValue間のランダムな値を求めるようにするに提供されています。

それは口を開いた。

これをもっと絵にしてみましょう。

普通は0から20までの乱数が必要ですが、同じシャッフルから0から10までの乱数が必要な場合は、upperBoundを10に設定して数字を「取り出す」ことができます。あなたの現在のシャッフルサイクルに残っている数字のうち、0と10の間です。

まあ...少なくとも、私はそれがうまくいくと思います。

あなたが100にupperBoundを設定した場合、理論的に、あなたの例のように、highestValueが活動の決定要因である必要があり、since the docs suggest:

この方法によって生成された番号にバインドされ、実際のアッパーが低い ですhighestValueプロパティとupperBoundパラメータを使用します。

+0

これを理解するのを手伝ってくれてありがとう。だから、forループで 'upperBound'を使用したとき、forループをたどり、それが私が見ていた複製を引き起こすたびに一時的にその値を100に変更していました。これは正しいです? –

+0

'highestValue'と同じ番号を使用したときの動作は完全にはわかりません。あなたがリピートを見る前に、どれくらいの数の数字を吐き出していますか?バグがあるかもしれません。 GameplayKitは約3人で使用されているため、完全にテストされていません。 – Confused

+0

私はこれをplaygroundでテストしました。upperBoundを5に、forループを0 ... 3に設定しました。私が得た結果は、 "4、0、1、1"で、upperBoundがforループの一時的な "highestValue"になるという元の答えを確認していました。ループが反復すると、一時的な "highestValue"のメモリは保持されないので、すべての値が選択される前に繰り返し値が返されます。あなたの答えは、アップルがそうしなかったときにこのパラメータを理解するのに役立ちます。ありがとうございました。 –

関連する問題