2017-07-01 59 views
0

我已經編寫了下面的程序,通過調用這個函數來產生隨機唯一的數字,但是看起來好像我只用很少的修改就能得到相同的模式。你有什麼想法或文檔說明爲什麼我們在swift中有arc4random_stir()?

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

什麼讓你覺得你需要用'stir'做任何事情? – pjs

+0

最初,我認爲這可能有助於生成唯一的隨機數。我試圖讓它適用於不同的編程步驟,但我不瞭解它的功能......請讓我知道。在此先感謝 – Saiteja

+0

你不應該需要它。當前的手冊頁甚至沒有顯示它,以及[歸檔的舊版手冊頁](https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/arc4random_stir.3.html )說:「arc4random_stir()函數從/ dev/urandom讀取數據,並使用它通過arc4random_addrandom()來排列S-Boxes。在使用arc4random()函數族之前,不需要調用arc4random_stir(),因爲它們會自動初始化他們自己。」 – pjs

回答

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] 

您還範圍產生10張隨機數爲1〜10,並避免重複,所以結果是總是將是數字1以某種順序爲10。

要生成給定範圍內的隨機數,請不要使用%,而應使用提供的arc4random_uniform(),這樣可以提供更好的分佈。

在標題arc4random_stir()中提到的函數在Swift中可用。

BTW(有些意見基於):這是更好地寫!e!是布爾不操作),而不是e == false永遠e == true這是e長表格!

順便說一句(SO禮儀):不要鏈接到您的代碼(或粘貼它的圖像)。減少到一個小例子來說明問題(在你的情況下不需要)並直接插入問題中。保持標籤最小和適當。這次編輯是由我自己和其他人完成的,下次你會知道。

HTH

+0

我完全明白了,我很新來Stack overflow發佈一個問題,但無論如何非常感謝你。請確保下次不再犯錯誤。 – Saiteja

+0

你有任何想法或arc4random_stir()函數的代碼示例.....讓我知道它將對我有幫助 – Saiteja

+0

在Swift中調用'arc4random_stir()'所需要做的只是將它自己寫在一行上。如果在終端中需要其文檔類型'man arc4random'。然而,如上面的結果所示,您不需要使用此函數,arc4random會自行初始化並在每次運行時產生一個隨機序列。 – CRD

相關問題