Skip to content

Instantly share code, notes, and snippets.

@tattyamm
Created February 10, 2012 06:06
Show Gist options
  • Save tattyamm/1787103 to your computer and use it in GitHub Desktop.
Save tattyamm/1787103 to your computer and use it in GitHub Desktop.
ガチャコンプまでの金額計算機
# ガチャコンプまでの金額計算機
# 作った経緯など http://blog.livedoor.jp/tattyamm/archives/3840157.html
# 例:コンプ対象カードの出現確率5%のガチャを8枚コンプするまで300円ガチャを回した場合、いくらでコンプできるか1万人でシミュレート。
# 計算結果:http://twitpic.com/8hwbyx
# 例:コンプ対象カードの出現確率3%のガチャを10枚コンプするまで300円ガチャを回した場合、いくらでコンプできるか1万人でシミュレート。
# 計算結果:http://twitpic.com/8hwv9d
# 各カードが出る確率は、コンプ状況によらず一定であるとしています。
# 誰かこのコードで正しく計算できてるのか確かめて下さい…。
# このコードをいじれば色々計算できるのではないでしょうか。
#@Sheile様のこちらに触発され作りました。http://49.212.5.128/compsim/
#ソースはちょっと拝見させて頂きましたが、1から自分で書いてしまったので、僕のには何かミスあるかもしれません
#このプログラムはtattyammが書きました
#連絡先 https://twitter.com/#!/tattyamm
#-----------------------------------------
#試行回数
try = 10000
#コンプ対象カード枚数
compCardNum = 8
#コンプ対象カード出現確率(コンプ対象カード全体の出現率合計)
compCardProb = 0.05
#ガチャ1回の金額
drawMoney = 300
#-----------------------------------------
#コンプするまでカードを引き続ける関数
#コンプするまでに使った金額を返す
infinity <- function(compCardNum ,compCardProb ,drawMoney){
rareCard = numeric(compCardNum)
drawCount = 0
while(length(which(rareCard>0)) < compCardNum){
card = drawCard(compCardNum , compCardProb)
drawCount = drawCount+1
if(card > 0){
#レアカードなので、引いたレアカードの枚数を1増やす
rareCard[card] = rareCard[card]+1
}else{
#はずれた
}
}
return (drawCount*drawMoney)
}
#ガチャ判定
#当たったらコンプ対象カード番号を返す。はずれたら0を返す。
drawCard <- function(compCardNum , compCardProb){
card = runif(1 , min=0, max=1)
if(card < compCardProb ){
#レアカードを引いた場合、カード番号を返す
return (floor(runif(1 , min=1, max=(compCardNum+1) )))
}else{
#はずれ
return (0)
}
}
#表示整形用の関数
#http://aoki2.si.gunma-u.ac.jp/R/printf.html
printf <- function(fmt, ...){
cat(sprintf(fmt, ...))
}
#-----------------------------------------
money = NULL #コンプまでにかけた金額
#計算
print( Sys.time()) #タイムスタンプ
for (i in 1:try) {
money[i] = infinity(compCardNum ,compCardProb ,drawMoney)
}
print( Sys.time()) #タイムスタンプ
#結果表示
#par(family="Osaka") #Macで日本語が表示できなかった場合はこのコメントを外して下さい
hist(money,xlab="コンプまでにかけた金額(円)" , ylab="人数" ,main="")
#ちょっとだけ分析
denData <-density(money)
mean <- mean(money)
mod <- denData$x[denData$y==max(denData$y)]
quan <- quantile(money)
printf("コンプ対象カードの出現確率%.1f%%のガチャを%i枚コンプするまで%i円ガチャを回した場合、いくらでコンプできるか%i人でシミュレート\n",compCardProb*100,compCardNum,drawMoney,try)
printf("平均値 = %.1f\n",mean)
printf("最頻値 = %.1f\n",mod)
printf("中央値 = %d\n",quan[3])
printf("下位75%% = %i\n",quan[2])
printf("上位75%% = %i\n",quan[4])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment