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

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

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

CocoaはMac OS X用のアプリケーションを構築する為の主要なフレームワークのひとつです。

Swift

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

Q&A

2回答

221閲覧

3つの画像の中からランダムに出力した後、クリックすると最初の出力画像とは異なる画像を出力したい。

DynMat

総合スコア12

Cocoa

CocoaはMac OS X用のアプリケーションを構築する為の主要なフレームワークのひとつです。

Swift

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

0グッド

0クリップ

投稿2018/05/11 11:37

編集2022/01/12 10:55

3枚の画像からランダムに1枚の画像を出力(QuestionNumber = 1) → ボタンをクリック →
QuestionNumber = 1とは異なる画像を出力(QuestionNumber = 2)→ ボタンをクリック → QuestionNumber = 1とQuestionNumber = 2とは異なる画像を出力(QuesutionNumber = 3)
これをQuestion = 14まで実行します。3枚の画像のセットが4つ、2枚の画像のセットが1つの計14枚の画像を出力するものです。最初の1セットのみのプログラムを下に示します。
下のプログラムでは1、2、3枚をそれぞれ異なる画像にすることができませんでした。

swift

1 var QuestionNumber : Int = 1 2 func Rd1(QUESTION_NUMBER : Int){ 3 var RandomNumber1 : Double = 0 4 RandomNumber1 = Double(arc4random() % 3 + 1) 5 if(QUESTION_NUMBER == 1){ 6 if(RandomNumber1 == 1){ 7 self.ImageView.image = img01 8 }else if(RandomNumber1 == 2){ 9 self.ImageView.image = img02 10 }else if(RandomNumber1 == 3){ 11 self.ImageView.image = img03 12 } 13 14 } 15 var RandomNumber2 : Double = 0 16 RandomNumber2 = Double(arc4random() % 2 + 1) 17 18 if(QUESTION_NUMBER == 2){ 19 20 if(RandomNumber1 == 1 && RandomNumber2 == 1){ 21 self.ImageView.image = img02 22 CorrectAnswer = "1" 23 }else if(RandomNumber1 == 1 && RandomNumber2 == 2){ 24 self.ImageView.image = img03 25 }else if(RandomNumber1 == 2 && RandomNumber2 == 1){ 26 self.ImageView.image = img01 27 }else if(RandomNumber1 == 2 && RandomNumber2 == 2){ 28 self.ImageView.image = img03 29 }else if(RandomNumber1 == 3 && RandomNumber2 == 1){ 30 self.ImageView.image = img01 31 }else if(RandomNumber1 == 3 && RandomNumber2 == 2){ 32 self.ImageView.image = img02 33 } 34 35 } 36 37 if(QUESTION_NUMBER == 3){ 38 if(RandomNumber1 == 1 && RandomNumber2 == 1){ 39 self.ImageView.image = img03 40 }else if(RandomNumber1 == 1 && RandomNumber2 == 2){ 41 self.ImageView.image = img02 42 }else if(RandomNumber1 == 2 && RandomNumber2 == 1){ 43 self.ImageView.image = img03 44 }else if(RandomNumber1 == 2 && RandomNumber2 == 2){ 45 self.ImageView.image = img01 46 }else if(RandomNumber1 == 3 && RandomNumber2 == 1){ 47 self.ImageView.image = img02 48 }else if(RandomNumber1 == 3 && RandomNumber2 == 2){ 49 self.ImageView.image = img01 50 } 51 52 } 53 } 54 55 func RandomQuestions(Question_Number : Int){ 56 if (Question_Number == 1 || Question_Number == 2 || Question_Number == 3){ 57 Rd1(QUESTION_NUMBER: Question_Number) 58 } 59@IBAction func InputDecide(_ sender: NSButton) { 60 61RandomQuestions(Question_Number : QuestionNumber) 62QuestionNumber += 1 63 64}

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

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

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

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

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

guest

回答2

0

配列をランダムで並べ替えた後、前から順に取り出します。

swift

1//元の配列(文字列にしていますが、そのままUIImageを入れてもかまいません) 2let array = ["img01", "img02", "img03"] 3print(array) 4//=> ["img01", "img02", "img03"] 5 6//シャッフル 7let shuffledArray = array.map {($0, arc4random_uniform(UInt32.max))}.sorted {$0.1 < $1.1}.map {$0.0} 8print(shuffledArray) 9//=> ["img02", "img01", "img03"] 10 11//あとは前から順に取り出す
シャッフルについて

シャッフルは別の方法でもかまいません。
例えば、今回は3枚の画像しかないので、組み合わせのテーブルを用意して、

swift

1//組み合わせテーブル 2let combinationTable = [ 3 [0, 1, 2], 4 [0, 2, 1], 5 [1, 0, 2], 6 [1, 2, 0], 7 [2, 0, 1], 8 [2, 1, 0], 9] 10//ランダムで組み合わせを選び、選んだ組み合わせの順に元の配列を並べ替える 11let shuffledArray = combinationTable[Int(arc4random_uniform(UInt32(combinationTable.count)))].map {array[$0]} 12print(shuffledArray) 13//=> ["img02", "img03", "img01"]

という方法でも出来ないことはないです。

他にも方法はありますので、自分で考えたり、調べてみたりしてはどうでしょうか?

投稿2018/05/14 00:41

fuzzball

総合スコア16731

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

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

0

以下のような考え方はいかがでしょうか?

swift

1 2// 画像を生成 3var image1 = UIImage() 4var image2 = UIImage() 5var image3 = UIImage() 6 7// 画像の配列を作成 8var imageArray = [image1, image2, image3] 9 10// ランダムな数を配列数から作成 11func random(arrayCount: Int) -> Int? { 12 guard arrayCount != 0 else { return nil } 13 return Int(arc4random_uniform(UInt32(arrayCount))) 14} 15 16// ボタンタップ時に呼び出すメソッド 17func buttonTapped() -> UIImage? { 18 if let index = random(arrayCount: imageArray.count) { 19 // ランダムで選んだ番号のIndexを削除して返す 20 return imageArray.remove(at: index) 21 } 22 // 配列が空の場合 23 return nil 24} 25 26// ボタン押下時にbuttonTapped()メソッドを呼び出す 27let resultImage1 = buttonTapped() //=> UIImage 28let resultImage2 = buttonTapped() //=> UIImage 29let resultImage3 = buttonTapped() //=> UIImage 30let resultImage4 = buttonTapped() //=> nil

投稿2018/05/11 12:21

編集2018/05/11 22:49
_Kentarou

総合スコア8490

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

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

DynMat

2018/05/11 12:59

func buttonTapped() は@IBAction func button Tapped()ではないのでしょうか?
_Kentarou

2018/05/11 13:16 編集

これはあくまでも例なので自身のプロジェクトに合わせて使ってみてください。 ``` @IBAction func buttonTapped() { imageView.image = buttonTapped() } ``` のような感じだと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問