Created
February 11, 2012 14:15
-
-
Save tattyamm/1799600 to your computer and use it in GitHub Desktop.
ガチャコンプまでの金額計算機2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# ガチャコンプまでの金額計算機2 | |
#@gigir様のこちらに触発され作りました。http://www.ani-ban.info/aimas/comp_sim/ | |
#この前書いた https://gist.github.com/1787103 を「アイドルマスターシンデレラガールズコンプガチャシミュレーター」向けに書き直したものです。プログラムとしてちょっと強引です。 | |
#実行結果 例 | |
#http://blog.livedoor.jp/tattyamm/archives/3841998.html | |
#このプログラムはtattyammが書きました | |
#連絡先 https://twitter.com/#!/tattyamm | |
#----------------------------------------- | |
#試行回数 | |
try = 100000 | |
#コンプ対象カード枚数 | |
compCardNum = 6 | |
#コンプ対象カード出現確率(コンプ対象カード全体の出現率合計) | |
compCardProb = 0.12 | |
#コンプ対象カードのうち、さらに出現確率が低いカードの枚数 | |
compRareCardNum = 2 | |
#コンプ対象カードのうち、さらに出現確率が低いカードの出現確率 | |
compRareCardProb = 0.12/2 | |
#ガチャ1回の金額 | |
drawMoney = 1500/6 #5連+1を考えるのが面倒なので、1回分の金額で計算 | |
#----------------------------------------- | |
#コンプするまでカードを引き続ける関数 | |
#コンプするまでに使った金額を返す | |
infinity <- function(compCardNum ,compCardProb ,drawMoney ,compRareCardNum , compRareCardProb){ | |
rareCard = numeric(compCardNum) | |
drawCount = 0 | |
while(length(which(rareCard>0)) < compCardNum){ | |
card = drawCard(compCardNum , compCardProb ,compRareCardNum , compRareCardProb) | |
drawCount = drawCount+1 | |
if(card > 0){ | |
#レアカードなので、引いたレアカードの枚数を1増やす | |
rareCard[card] = rareCard[card]+1 | |
}else{ | |
#はずれた | |
} | |
#printf("カード枚数 = %i\n",drawCount) | |
} | |
return (drawCount*drawMoney) | |
} | |
#ガチャ判定 | |
#当たったらコンプ対象カード番号を返す。はずれたら0を返す。 | |
drawCard <- function(compCardNum , compCardProb ,compRareCardNum , compRareCardProb){ | |
card = runif(1 , min=0, max=1) | |
if(card < compCardProb ){ | |
#レアカードを引いた場合、カード番号を返す | |
probSum = (compCardNum-compRareCardNum)*compCardProb + compRareCardNum*compRareCardProb; #確率を合計 | |
rareCard = runif(1 , min=0, max=probSum) | |
#printf("レアカード生成 = %f\n",rareCard) | |
#まず、普通のレアカードか、特殊なレアカードかを分類する | |
if(rareCard < ((compCardNum-compRareCardNum)*compCardProb) ){ | |
#普通のレアカード | |
#printf("normal card.%i\n",(floor(runif(1 , min=1, max=(compCardNum-compRareCardNum+1) )))) | |
return (floor(runif(1 , min=1, max=(compCardNum-compRareCardNum+1) ))) | |
}else{ | |
#特別なレアカード | |
#printf("rare card.%i\n",(floor(runif(1 , min=1, max=(compRareCardNum+1) ))+compCardNum-compRareCardNum)) | |
return (floor(runif(1 , min=1, max=(compRareCardNum+1) )) + compCardNum-compRareCardNum) | |
} | |
}else{ | |
#はずれ | |
#printf("はずれ\n") | |
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) { | |
printf("now = %i\n",i) | |
money[i] = infinity(compCardNum ,compCardProb ,drawMoney ,compRareCardNum ,compRareCardProb) | |
} | |
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("ただし、コンプ対象カードのうち%i枚の出現確率は%.1f%%とする\n",compRareCardNum , compRareCardProb*100); | |
printf("平均値 = %.1f\n",mean) | |
printf("最頻値 = %.1f\n",mod) | |
printf("中央値 = %d\n",quan[3]) | |
printf("下位75%% = %.0f\n",quan[2]) | |
printf("上位75%% = %.0f\n",quan[4]) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment