[英]Swift - Generating random number that is not in retrieved list
我正在嘗試從用戶默認值中檢索列表,生成不在此列表中的隨機數,然后將此數字附加到列表中並再次保存。
我的函數如下所示:
func createRandiAndSaveNumberToCell()->Double{
var defaults = NSUserDefaults.standardUserDefaults()
var numbersList: [Int] = []
if let firstNameIsNotNill = defaults.objectForKey("usedNumbersList") as? [Int] {
numbersList = defaults.objectForKey("usedNumbersList") as [Int]
}
var randomNumb = Int(arc4random_uniform(10))
while contains(numbersList, randomNumb){
randomNumb = Int(arc4random_uniform(10))
}
numbersList.append(randomNumb)
defaults.setObject(numbersList, forKey: "usedNumbersList")
var randi = Double(randomNumb)
println(numbersList)
return randi
}
這將返回如下列表:
[13, 26, 75, 35, 57, 23, 6, 0, 74, 69, 38, 30, 3, 29, 52, 62, 46, 42, 37, 55, 65, 9, 18, 49, 15, 40, 71, 20, 44, 67, 43, 21, 33, 59, 8, 1, 63, 68, 2, 5]
作為第一個列表,並且對於每個附加的數字,它還會在此數字之前添加3個數字。 盡管沒有數字會重復,但這不是我想要的結果,因此我需要知道創建該隨機數的函數是否出錯。
任何建議如何進行將不勝感激。
請記住,您的用戶默認值將在程序運行期間持續存在。 大概您已經(通過先前的嘗試)設法保存了您提供的該列表的值。
嘗試將代碼粘貼到新的Swift控制台應用程序中。 它最多可以正常運行10次,然后進入無限循環-因為usedNumbersList
已經包含了所有可能的10個數字-因此while循環永遠不會終止。
為什么您的代碼中沒有出現無限循環,但您描述的行為卻有些神秘。 原因可能是您在問題中給出的功能之外的代碼。 但是似乎您需要能夠檢測到這種情況並以某種方式處理它。
順便說一句,如果將它分成兩個函數,可能會發現更容易調試該代碼,其中一個函數生成不在給定列表中的隨機數:
func randomNotIn(source: [Int], #upperBound: UInt32) -> Int {
// detect possible infinte loop
precondition(source.count < Int(upperBound))
// by making this a do…while, you can scrap the double-assignment:
var candidate: Int // you don’t _have_ to give a var a value
do {
// so long as the compiler can see it’s guaranteed to be
// assigned a value before it’s first used
candidate = Int(arc4random_uniform(upperBound))
} while contains(source, candidate)
return candidate
}
這樣,您就可以從獲取/保存代碼中獨立測試隨機數生成函數(也許在操場上試用一下):
func createRandiAndSaveNumberToCell() -> Double {
let defaults = NSUserDefaults.standardUserDefaults()
let usedKeyName = "usedNumbersList"
// this is an alternative to your if-let, which uses the “??” operator
// to supply an empty list when objectForKey returns nil:
let usedNumbersList = defaults.objectForKey(usedKeyName) as? [Int] ?? []
let newRandom = randomNotIn(usedNumbersList, upperBound: 10)
let newUsedNumbersList = usedNumbersList + [newRandom]
defaults.setObject(newUsedNumbersList, forKey: usedKeyName)
println(newUsedNumbersList)
return Double(newRandom)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.