質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1699閲覧

swift3で配列の順列を得たい

meia

総合スコア26

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/02/18 11:10

###前提・実現したいこと
swift3
xcode8で作業しています

swiftで配列をランダムに並べ替えたくてPlaygroundで練習しています。
以下のサイトを参考に作業しております。
Swift:重複しない乱数について
順列を一瞬で取得するプログラム

2つ目のリンクの内容をswiftで表現したいのですが、うまくいかなくて困っております

###発生している問題・エラーメッセージ

fatal error : index out of range

###該当のソースコード

swift

1 2// 元はJavascriptの「n個の数字の順列において、辞書式順序のm番目を戻す」コードだそうです 3 4let n:Int = 5 5var m:Int = 2 6 7 var temp:[Any] = [] 8 for i in 0..<n{ 9 temp[i] = i 10 } 11 12 var surplus:[Any] = [] 13 14 for i in 1..<n{ 15 // この下の行で上記のエラーが出現します。 16 surplus[n - i] = m % i 17 m = Int(floor(Double(m/i))) 18 } 19 20 surplus[0] = m 21 22 var order:[Any] = [] 23 for i in 0..<n{ 24 let num:Int = surplus[i] as! Int 25 order[i] = temp[num] 26 for j in num..<n - 1{ 27 temp[j] = temp[j + 1] 28 } 29 } 30 31print(order)

###試したこと

上記のほかでも、配列の順列(重複しない乱数)を取得できる方法があれば、それでも構わないので、ご存知の方がいらしたら教えていただきたいです。

###補足情報(言語/FW/ツール等のバージョンなど)
そのほかにもm = Int(floor(Double(m/i)))のところやfor j in num..<n - 1のところが本来のものと違ったりして、おかしい場所があるので、ついでに教えていただけると助かります。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

このコードが何をやっているのか意味はわかりませんが、
とりあえず「index out of range」が出る原因は、

Swift

1var temp:[Any] = []

と要素数が0個の配列を定義しているところに

Swift

1for i in 0..<n { 2 temp[i] = i 3}

で要素の存在しない配列番号に代入しようとしているためだと思います。
JavaScriptは要素の存在しないところに代入したら自動的にその要素が
作られますが、Swiftは自動的には作られません。

Swift

1var temp = [Int](repeating: 0, count: n)

のように、あらかじめn個の要素を持った配列を定義すれば、
とりあえず今のエラーは消えると思います。
surplusやorderの定義も同様です。

投稿2017/02/19 18:17

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meia

2017/02/23 11:11

丁寧な解説ありがとうございました! おかげでエラーを解決することができました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問