###前提・実現したいこと
Xcode6.4 (6E35b),iOS SDK8.4の環境でアプリを作ろうとしています。ボタンを押すと、手札にランダムなマーク、数字のカードが追加されるというようなプログラムを作りました。しかし、その「ランダム」がなんだかおかしいです。。。
###発生している問題・エラーメッセージ
このように、まあランダムではあるんですが、明らかに偏りが生じています。。。これじゃあトランプでゲーム!なんてとてもじゃないけどできません。。。
下記のソースコードのランダムの部分を作ってるコードはplaygroundで作ったものなのですが、playgroundでは正常に作動していました。しかし実際にアプリの方に移したらこのような結果になっています。。。
###ソースコード
swift
1import UIKit 2 3class ViewController: UIViewController { 4 5 var w = UIScreen.mainScreen().bounds.size.width 6 var h = UIScreen.mainScreen().bounds.size.height 7 var imageView :Array<UIImageView> = [] 8 var n = 0 9 var tefuda = [Int](count: 21, repeatedValue: 0) 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 // Do any additional setup after loading the view, typically from a nib. 14 15 for i in 0...20 { 16 tefuda[i] = Int(arc4random_uniform(51)) + 1 17 } 18 } 19 20 override func didReceiveMemoryWarning() { 21 super.didReceiveMemoryWarning() 22 // Dispose of any resources that can be recreated. 23 } 24 25 @IBOutlet weak var imageButton: UIButton! 26 27 @IBAction func buttonAction(sender: AnyObject) { 28 29 var color = "c" 30 var number = 0 31 var show = "c01" 32 33 34 //println("\(tefuda[n])") 出力されず… 35 36 switch tefuda[n] { 37 38 case 1...13: 39 color = "c" 40 case 14...26: 41 color = "d" 42 case 27...39: 43 color = "h" 44 case 40...52: 45 color = "s" 46 default: 47 break 48 49 } 50 51 if tefuda[n] % 13 == 0 { 52 number = 13 53 } else { 54 number = tefuda[0] % 13 //←ここの0がnでした 55 } 56 57 if number < 10 { 58 show = color + "0" + String(number) 59 } else { 60 show = color + String(number) 61 } 62 63 imageView.append(UIImageView(frame: CGRectMake(CGFloat(10+20*n), CGFloat(9*h/10-150), CGFloat(100), CGFloat(150)))) 64 65 self.view.addSubview(imageView[n]) 66 67 imageView[n].image = UIImage(named: show) 68 69 n++ 70 71 } 72} 73
###補足情報(言語/FW/ツール等のバージョンなど)
- 画像はc01.png(クローバーの1)からc13.png(クローバーの13)まで、といった感じにリソースファイル(?)に読み込んであります。ダイヤはd、ハートはh、スペードはsが数字の前についています。
- 配列tehudaをprintln()で出力しようとしたのですがなぜか出力されず。。。何回再起動しても同じ数字ばっかりでます…なぜか時々挟まってくるキングが不思議です笑
- arc4random_uniformのところをarc4randomでやったりもしましたがダメでした
- 内容的には、ブラックジャックを意識してます。6デッキ以上使うことを想定しているため、Aが21枚出るかも…と思ったので、tehuda[]の要素数は21個です。
- プログラミングは趣味でやってます。初心者ですので、とても初歩的なミスをしてるかもしれません。そうだったらごめんなさい。
- 初めて質問します。何か無礼なことがあったら、申し訳ございません。もしよろしければ、分かる方、ご教授お願いいたします
####解決
ミスを修正した結果、ちゃんとランダムになりました!やった!回答してくださったお二方、本当にありがとうございました。
####複数のデッキを使った時のシャッフル
swift
1import UIKit 2 3class ViewController: UIViewController { 4 5 var w = UIScreen.mainScreen().bounds.size.width 6 var h = UIScreen.mainScreen().bounds.size.height 7 var imageView :Array<UIImageView> = [] 8 var n = 0 9 ☆var deckCount = 6 //デッキ数 10 var tefuda = [Int](count: 21, repeatedValue: 0) 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 // Do any additional setup after loading the view, typically from a nib. 15 16 ☆var card = [Int](count: 52*deckCount, repeatedValue: 0) 17 18 //シャッフルされた配列 19 ☆var shuffledCard :Array<Int> = [] 20 21 //1~52がデッキ数並んだ配列card 22 ☆for i in 0...52*deckCount-1 { 23 ☆ card[i] = i % 52 + 1 24 ☆} 25 26 //シャッフル 27 ☆for i in 0...52*deckCount-1 { 28 ☆ var index = Int(arc4random()) % card.count 29 30 ☆ shuffledCard.append(card[index]) 31 ☆ card.removeAtIndex(index) 32 ☆} 33 34 for i in 0...20 { 35 ☆ tefuda[i] = shuffledCard[i] 36 } 37 } 38 39 override func didReceiveMemoryWarning() { 40 super.didReceiveMemoryWarning() 41 // Dispose of any resources that can be recreated. 42 } 43 44 @IBOutlet weak var imageButton: UIButton! 45 46 47 48 49 50 51 @IBAction func buttonAction(sender: AnyObject) { 52 53 var color = "c" 54 var number = 0 55 var show = "c01" 56 57 58 //println("\(tefuda[n])") 59 60 switch tefuda[n] { 61 62 case 1...13: 63 color = "c" 64 case 14...26: 65 color = "d" 66 case 27...39: 67 color = "h" 68 case 40...52: 69 color = "s" 70 default: 71 break 72 73 } 74 75 if tefuda[n] % 13 == 0 { 76 number = 13 77 } else { 78 number = tefuda[n] % 13 79 } 80 81 if number < 10 { 82 show = color + "0" + String(number) 83 } else { 84 show = color + String(number) 85 } 86 87 imageView.append(UIImageView(frame: CGRectMake(CGFloat(10+20*n), CGFloat(9*h/10-150), CGFloat(100), CGFloat(150)))) 88 89 self.view.addSubview(imageView[n]) 90 91 imageView[n].image = UIImage(named: show) 92 93 n++ 94 95 } 96} 97
☆の部分を変更、及び追記しました。
良いプログラムではないと思いますが、正常に動作するのを確認できました。
シャッフルの処理はこちらより丸コピさせていただきました。勝手に使ってごめんなさい。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/19 15:16