2016-11-22 21 views
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提供,讓您詢問您的lowestValue和一個新的(臨時)highestValue使用小於之間的隨機值的highestValue你已經創建GKShuffledDistribution實例時設置。

糟糕。這是口吻。

讓我試試這更多的圖片。

如果您通常需要一個介於0到20之間的隨機數,但有時您希望只有一個介於0和10之間的隨機數,那麼您可以將upperBound設置爲10,然後將數字「拉出」這是介於0和10之間的當前洗牌循環中留下的數字。

那麼......至少我認爲這就是它應該如何工作。

理論上,當你設置upperBound至100中,如在實施例中,highestValue應該是活動的決定因素,since the docs suggest:

實際上由該方法生成的數字界是 較小的highestValue屬性和upperBound參數。

+0

謝謝你幫我理解這一點。因此,當我在for循環中使用'upperBound'時,每次經過for循環時都會暫時將該值更改爲100,從而導致我看到的重複項。它是否正確? –

+0

我不完全確定當你使用與'highestValue'相同的數字時它是如何工作的。或者在你看到重複之前你抽出了多少個數字。可能有一個錯誤。 GameplayKit被大約3人使用,所以它不會被徹底測試。 – Confused

+0

所以我通過設置upperBound爲5和for循環0 ... 3在操場上測試了這個。我得到的結果是「4,0,1,1」,確認你最初的答案,即upperBound成爲for循環中臨時的「highestValue」。一旦迭代循環,臨時「highestValue」的記憶就不會被保留,因此在選擇所有可能的值之前,我得到了重複的值。當蘋果未能這樣做時,你的回答可以幫助我理解這個參數。謝謝。 –

相關問題