2017-07-01 1 views
0

私は関数を呼び出すことによって、いくつかの回数のランダムな一意の数値を生成するために以下のプログラムを書いていますが、最小限の変更で同じパターンを得ているようです。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

あなたは「詰まる」と何かする必要があると思いますか? – pjs

+0

最初は、それがユニークな乱数を生成するのに役立つと思った。そして、私はそれが異なるプログラミングステップで動作するようにしようとしていたが、私はその機能を理解していなかった...私に教えてください。事前に感謝 – Saiteja

+0

あなたはそれを必要はありません。現在のマニュアルページには表示されません。また、[アーカイブされたレガシーmanページ](https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/arc4random_stir.3.html )arc4random_stir()関数は、/ dev/urandomからデータを読み込んで、arc4random_addrandom()を介してS-Boxesを並べ替えるために使用します。arc4random_stir()を呼び出す必要はありません。自分自身。 – pjs

答えて

2

数字はSetに保存されており、セットは注文されていないので、エレメントがprintで表示される順序は、セットに追加された順序とは無関係です。

セットの要素は、.contains()の高速チェックが可能な方法で格納されています。これは、同様のシーケンスが表示される理由の1つです。

挿入順序を保持する場合は、これを行うコレクション、つまり配列を使用します。あなたのコード内の配列に変更するには、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()を使用してください。

あなたのタイトルに記載されている機能は、Swiftで利用可能です。arc4random_stir()

BTW(をベース多少の意見):むしろe == falseより!e!がブールないオペレータであること)を書き、そしてeの長い形である決して書き込みe == true方が良いです!

BTW(SO礼儀):コードにリンクしたり、画像を貼り付けたりしないでください。その問題を示す小さな例にしてください(あなたの場合は必須ではありません)。質問に直接挿入してください。タグを最小限に保ちます。今回の編集は自分自身と他の人がこの時間あなたのためにしてくれました。あなたは次回のために知っています。

HTH

+0

私は完全にそれを得て、私はスタックオーバーフローの質問を投稿するのは非常に新しいですが、とにかくあなたにそんなに感謝します。次回は間違いを繰り返さないようにします。 – Saiteja

+0

arc4random_stir()関数のアイデアやコードサンプルはありますか?..... – Saiteja

+0

Swiftの 'arc4random_stir()'を呼び出すために必要なことは、それだけでそれを1行に書き留めるだけです。そのドキュメントが必要な場合は、ターミナルで 'man arc4random'と入力してください。しかし、上記の結果が示すように、この関数を使用する必要はありません。 'arc4random'自体が初期化され、実行されるたびにランダムなシーケンスが生成されます。 – CRD

関連する問題