您对swift中有arc4random_stir()的原因有什么想法或文档吗?

时间:2017-07-01 19:26:12

标签: swift

我已经编写了下面的程序,通过调用函数多次生成随机唯一数字,但似乎我得到了相同的模式,只需要很少的更改。

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)

如何使我的程序有效运行以生成多个随机唯一数字。

请告诉我这对我很有帮助。

1 个答案:

答案 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