ルーレットで勝てる？(2)

##背景
 「ルーレットで勝てる？」で赤に賭け続けるとある条件を満たせば100%勝てることをシミュレーションで結果を示しました。しかし、ギャンブルではほとんどは多数択のゲームです。一般的なギャンブルの必勝方法を探りましょう。
##モデル対象
対象：すべてのギャンブル。オッズが分かれば十分。
注意点：シミュレーションするには、確率は事前にわからないと計算できない。
必要条件：所持金。(所持金が0になると、ゲーム終了。)
今回問題は、ルーレットの数字「1」に賭け続けるゲームにします。
###賭け1
1betで数字「1」に1ドルを賭ける。当たったら、36倍の配当をゲット。
「1」が出る確率：　1/37
###賭け2
数字「1」に賭け続ける。当たったら、betを終了させる。外れたら、賭け続ける。
賭け金は以下の条件を満たせばよい。
　　今まで負け続けていた分の総額　＜　今回の賭け金＊オッズ(倍率、配当金)
最初に当たる時、必ず1ドル以上の利益が保たれる。

##シミュ―レーション
ルーレット参加者：1000人
所持金:10000ドル
賭け回数：1000回

##結果
||平均収益|収益最大|収益最小|瞬時最大収益|所持金0になった人数|儲かる人数|全体の割合|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|賭け1|-30.700|620.00|-604.00|35.00|0|451|0.451|
|賭け2|533.959|856.00|186.00|224280|44|1000|1.000|

賭け1:　表を御覧ください。
賭け2:　所持金が十分であれば、100%勝てる。
　　　　（瞬時最大収益に超えればよい。）
　　　　所持金が10000ドルに設定される場合、途中で所持金をすべて無くし
　　　　ゲーム終了された人数は44しかない。

図（無作為で選んだ番号の参加者のpath)
<img src="https://qiita-image-store.s3.amazonaws.com/0/114190/e5360977-8dbd-1259-f1d4-819534823f77.png" width = "600" height = "300" alt="图片名称" align=center />

##コード

```r:
#　設定値
p<-1/37 # 確率の設定値
Return<-36
Money<-10000　#　所持金の設定値
n<-1000　#　bet回数
k<-1000　#　賭けに参加人数
#####################################################
# Risk Set
Rset<-matrix(0,n^2,4)
Rset[1,]<-c(0,0,0,0)
Rset[2,]<-c(1,ceiling(Return)-1,ceiling(Return)-1,ceiling(Return)-1)
for(i in 3:(n^2)) {
  Rset[i,1]<-i-1
  Rset[i,2]<-ceiling(((i-1)*Return-Rset[i-1,3])/(i-1))-1
  Rset[i,3]<-Rset[i-1,3]+(i-1)*Rset[i,2]
  Rset[i,4]<-Rset[i-1,4]+Rset[i,2]
}
Rset<-Rset[which(Rset[,2]>0),]
#####################################################
# 関数の定義
funsum<-function(x) { sum(x[1:max(which(x>0))]) }

funmin<-function(x) { min(x[1:max(which(x>0))]) }

fun2<-function(x) {
  y<-matrix(0,n,2)
  y[1,]<-c(1,1)
  for(i in 2:n) { if(x[i-1]==0) y[i,1]<-y[i-1,1]+1
  else y[i,1]<-1 }
  for(i in 2:(n^2)) {
    y[which(y[,1]<=Rset[i,4]&y[,1]>Rset[i-1,4]),2]<-Rset[i,1]*(-1)
    if(Rset[i,4]>=max(y[,1]))
    break
    }
  y[which(x==1),2]<-(-Return+1)*y[which(x==1),2]
  y[,2]
  }
#####################################################
#　賭け1
Data1<-matrix(rbinom(n*k,1,p),n,k)　#　二項乱数を取る
Winnings1<-Data1
Winnings1[,]<--1
Winnings1[which(Data1[,]==1)]<-Winnings1[which(Data1[,]==1)]+Return #　Winningsは収益
Money1<-apply(Winnings1,2,cumsum)+Money　#　Moneyは所持金
AM1<-apply(Money2,1,mean)

#　賭け2
Data2<-matrix(rbinom(n*k,1,p),n,k)
Winnings2<-apply(Data2,2,fun2)
Money2<-apply(Winnings2,2,cumsum)+Money
#####################################################
#　結果
result<-matrix(0,7,2)
rownames(result)<-c("average","max","min","range","lost all","winner","rate")
colnames(result)<-c("gamble1","gamble2")
result[,1]<-c( mean(apply(Winnings1,2,sum)),max(apply(Winnings1,2,sum)),
               min(apply(Winnings1,2,sum)),max(Winnings1),
               length(which(apply(Money1,2,min)<=0)),
               length(which(apply(Winnings1,2,sum)>=0)),
               length(which(apply(Winnings1,2,sum)>=0))/k )
result[,2]<-c( mean(apply(Winnings2,2,funsum)),max(apply(Winnings2,2,funsum)),
               min(apply(Winnings2,2,funsum)),max(Winnings2),
               length(which(apply(Money2,2,funmin)<=0)),
               length(which(apply(Winnings2,2,funsum)>=0)),
               length(which(apply(Winnings2,2,funsum)>=0))/k )
result
#####################################################
#　結果とデータの出力
setwd("c:/R") # 出力path
write.table(result,"gamble_result.csv",sep=",")　#　結果
write.table(Data1,"gamble1_data.csv",sep=",",row.names = FALSE)　#　賭け1のデータ
write.table(Data2,"gamble2_data.csv",sep=",",row.names = FALSE)　#　賭け2のデータ
# 図の出力
rnk<-ceiling(runif(1)*k) # rnkは無作為で選んだ参加者の番号
fname<-paste("gamble",".png",sep="")
png(file=fname,height=500, width=800)
par(mfrow=c(1,2))
plot(Money1[,rnk],type="l",main="gamble1",xlab="round of bet",ylab="money",col="Red")
plot(Money2[,rnk],type="l",main="gamble2",xlab="round of bet",ylab="money",col="Blue")
dev.off()
```