Skip to content

Instantly share code, notes, and snippets.

@tattyamm
Created February 11, 2012 14:15
Show Gist options
  • Save tattyamm/1799600 to your computer and use it in GitHub Desktop.
Save tattyamm/1799600 to your computer and use it in GitHub Desktop.
ガチャコンプまでの金額計算機2
# ガチャコンプまでの金額計算機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