我已经编写了下面的程序,通过调用函数多次生成随机唯一数字,但似乎我得到了相同的模式,只需要很少的更改。
func generateRandom(withinNumber: Int) {
var i:Int = 0
var elements = Set<Int>()
while i != withinNumber {
let num:Int = Int(arc4random())%withinNumber + 1
if elements.count <= withinNumber && elements.contains(num) == false {
elements.insert(num)
}
else {
i = i-1
}
i=i+1
}
print(elements)
elements.removeAll()
}
generateRandom(withinNumber: 10)
如何使我的程序有效运行以生成多个随机唯一数字。
请告诉我这对我很有帮助。
答案 0 :(得分:2)
您正在将您的号码存储在Set
中,并且不会对集合进行排序,因此print
显示元素的顺序与它们添加到集合中的顺序无关。
相反,集合的元素以某种方式存储,可以快速检查.contains()
,这是您看到类似序列的一个原因。
如果您希望保留插入顺序,请使用执行此操作的集合,即数组。更改为代码中的数组会产生以下9次调用的结果:
[8, 9, 7, 10, 5, 6, 2, 3, 1, 4]
[4, 9, 10, 3, 6, 2, 1, 7, 8, 5]
[8, 3, 5, 1, 6, 4, 9, 10, 7, 2]
[5, 7, 2, 9, 8, 1, 6, 10, 3, 4]
[2, 3, 7, 6, 9, 1, 8, 10, 5, 4]
[9, 10, 2, 4, 6, 8, 5, 7, 1, 3]
[9, 10, 2, 5, 4, 7, 3, 8, 1, 6]
[1, 6, 4, 5, 8, 2, 3, 9, 7, 10]
[6, 10, 5, 3, 2, 8, 1, 9, 7, 4]
您还在1到10的范围内生成10个随机数并避免重复,因此结果总是按某种顺序为1到10的数字。
要生成给定范围内的随机数,请不要使用%
,而是使用提供的arc4random_uniform()
,这样可以更好地进行分发。
标题arc4random_stir()
中提及的功能在Swift中可用。
BTW(基于意见):最好写!e
(!
是布尔运算符而不是e == false
而不是{em} >从来没有写e == true
这是e
的长形式!
BTW( SO礼仪):不要链接到你的代码(或粘贴它的图像)。减少演示问题的小例子(在您的情况下不需要)并直接插入问题中。保持标签最小和适当。这次编辑是由我自己和其他人为你完成的,你将在下次知道。
HTH