内容
アイフォンアプリ開発Swift ランダムな数字が並んだ配列の作り方、重複しない数字を持つ配列を作りたい
手順
最初に作りたい全数字の連番配列を作っておいて、そこからランダムに取り出す。
そして、その配列から取り出した数字を削除しておく。
これで同じ数字が取り出されることはなくなる。
サンプル例
まず最初に0から最大値までを順番に登録します。次にランダムに数を選び、抽出します。ここで選んだ番号は最初の配列から削除しておきます。
次も同様にランダムに数を選びます。なおランダムの総数は徐々に減っていくようにして存在しない配列の数にならないようにします。そうしないと範囲外のエラー out of range errorになります。
手間がかかりますが、何をするかわかりやすく取得する数も調整しやすいと思います。
これは模範解答ではないので、探せばもっと効率が良くてエレガントなコードがあると思います。
(これから)
従来例、
同じ数字が配列に入っていたら何度もランダム生成を繰り返すリピートプログラム
(これから)
引数としてランダム生成する数 いわゆる最大値を登録し例えば10個とすると0-9の数をランダムに取得して重複無く配列に追加します。
配列の数が10個になるまでループします。
コードを間違えると無限ループになりますのでオススメしないコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
func getRandom(cnt:Int)->Int{ //0からランダムの取得なります。 var result:Int result = Int(arc4random() % UInt32(cnt)) return result } func randomSet(cInt:Int){//cIntの数だけランダムに取り出す var mondaiList:[Int] = []//ランダムな番号を配列に入れる。(ちなみに実際のプログラムでは、この変数は、この関数の外、グローバル変数にしています。) var result = 0 var checkCount = 0 while mondaiList.count <= cInt { checkCount = 0 result = getRandom(cnt: cInt) if mondaiList.count >= cInt {break} if mondaiList.count != 0{ for i in mondaiList { if i == result { checkCount += 1 } }//for //全体のループが終わってから重複が無いことを確認してappendする if checkCount == 0{ mondaiList.append(result) if mondaiList.count >= cInt{ break } } }else{ mondaiList.append(result) }//if }//while } |