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

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

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

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Xcode

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

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

2回答

1442閲覧

計算のミス?

souroppy

総合スコア44

Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Xcode

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

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

1クリップ

投稿2016/07/20 06:43

ガチャのコンプリートまでに引く回数を計算するプログラムを作りたいです。
具体的には、まず1種類キャラクターがいるときにコンプリートするまでにかかる回数=1、次に二種類キャラクターがいるときにコンプリートまでにかかる回数=3、次に三種類キャラクターがいるときに・・・と続けていき、大体50ぐらいまでその作業を行いこの結果の「1」、「3」、・・・の部分を表示させるプログラムが作りたいのですが自分が作ってみたもの

Swift

1 2import UIKit 3 4 5 6var A: Int = 1 7var B: Double = 0 8var C: Double = 0 9var kekka:Double = 0 10var saigo:Double = 0 11var saigo2:Double = 1 12 13for count in 1...49 { 14 A = A + 1 15 saigo2 = saigo2 + saigo 16 saigo = 0 17 print(saigo2) 18 var C: Double = Double(A) 19 for count in 1...A { 20 var B: Double = Double(A) 21 B = B - 1 22 kekka = C / B 23 24 saigo = saigo + kekka 25 kekka = 0 26 27 } 28}

では、少し答えがおかしくなってしまいます。(数字が思っているものと違う)

Swift

11.0 25.0 39.5 414.8333333333333 521.0833333333333 628.2833333333333 736.45 845.5928571428571 955.7178571428571 1066.8289682539683 1178.9289682539683 1292.0198773448773 13106.103210678211 14121.180133755134 15137.251562326562 16154.318228993229 17172.380728993229 18191.439552522641 19211.495108078196 20232.547739657144 21254.597739657144 22277.645358704763 23301.690813250217 24326.734291511087 25352.775958177754 26379.815958177754 27407.854419716215 28436.891456753252 29466.927171038966 30497.961653797587 31529.99498713092 32563.027245195437 33597.058495195437 34632.08879822574 35668.118209990445 36705.146781419017 37743.174559196795 38782.201586223822 39822.227902013295 40863.253543038936 41905.278543038936 42948.302933282839 43992.326742806648 441037.3499986206 451083.37272589333 461130.39494811555 471178.41668724599 481227.43796384173 491277.45879717506

補足
確率は全て一律とします。(例えば50種類の時は一つのものの確率は2%。)
あくまでも計算上の話です。

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

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

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

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

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

Mr_Roboto

2016/07/20 06:49

ひとつ前に、同じような質問をしていますね? https://teratail.com/questions/41613 そちらは、どうなりましたか? 回答している人に失礼になりますので、きちんと1つずつ解決してからにしてくださいね。
ozwk

2016/07/20 09:08 編集

2種類のとき3回という数字はどうやって導出しましたか?期待値ですか?
coco_bauer

2016/07/20 09:21

2種類のキャラが、それぞれ100個ずつ入っているとすればコンプリートまで101回。1000個ずつ入っていれば1001回が、確実にコンプリートするまでに必要な回数です。 最初にガチャに何が入っているのかという条件を書かないと、回答は出せませんよ。
guest

回答2

0

まず、ガチャがソシャゲのように各キャラクターのストックに出現量の制限がないものなのか、それとも現実のガチャガチャの様に各キャラクターのストックの出現量に制限が存在するかで問題が変わりますね。

さてまずは、ソシャゲタイプのガチャの場合を考えてみます。

この場合は、ひとつのキャラが永遠に出現することもあり、何回ガチャを引けどもコンプリートできない場合があります。

そこで、

n種類のキャラクターが等確率で出現するガチャで、m(>=n)回までにコンプリートできる確率

を求めることにします。

数学っぽい問題にして考えるならば、

n個の穴に向かってm回ボールを投げ入れる。各穴にボールが入る確率は等確率として、すべての穴にボールが入っている確率

を求めるわけですね。

まず全パターン数を求めます。

穴を○と表現し、区切りを|で表すとして、

n個の丸と(m-1)個の|の並び替えを考えます。(|○○○||○○|○|○○ のような表現)

区切りによってできる各部分が穴に入ったボールの個数というわけです。(上記の表現なら穴1は空、穴2には3つのボールが入っている...)

この考えで全パターンは

(m+n-1)C(n-1)

となります。

で次に、

少なくともすべての穴に1つ以上ボールが入っているパターン数

を求めます。これは、

各穴に1つボールが入った状態からボールを投げるパターン数

と一致します。つまりパターン数は、

(m-n+(n-1))C(n-1)

となります。

よって求める確率は

(m-n+(n-1))C(n-1)/(m+n-1)C(n-1)

ですね。(数式のCは高校数学のコンビネーションのものです)

次に、リアルのガチャガチャの場合を考えてみます。

条件として、

n個のキャラクターc1,c2,...,cnがガチャガチャの中に、p1,p2,...,pn(pi > 0, i=1,..n)個存在するとします。

このとき、確実にコンプリートできるパターンで、最もたくさんガチャガチャを引かなければならない(運が悪い)のは

一番ストックの少ないキャラが最後まで出てこない

(つまり、ガチャガチャの中が一番ストックの少ないキャラだけになり、その後に最後の1回を引いてコンプリート)

パターンの時ですね。

なので、コンプリートするまでに最も運が悪いと

p1+p2+...+pn - min(p1,p2,...,pn) + 1

回引くことになります。

計算は多分あっていると思います。

swiftはよくわかりませんので、実装はお任せ致します。

投稿2016/07/20 12:30

編集2016/07/20 12:34
realizerS

総合スコア265

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

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

0

まともな仕様が出てきそうにないので逆丸投げ。

swift

1for num in 1...49 { 2 var sigma = 0.0 3 for count in 1...num { 4 sigma = sigma + 1.0 / Double(count) 5 } 6 let comp = Double(num) * sigma 7 print("[\(num)種類] \(comp)回") 8}

投稿2016/07/20 07:47

fuzzball

総合スコア16731

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問