我想知道是否有人可以帮我在R中创建俄罗斯轮盘游戏?我是R的新手,也是一般编写代码的人。我非常感谢你的帮助!
游戏使用配有可旋转六次弹匣的左轮手枪。左轮手枪装有一枪。第一位决斗者A随意旋转杂志,将左轮手枪指向他的头部并按下扳机。如果,之后,他还活着,他将左轮手枪交给另一个双手演奏者B,他的行为与A一样。玩家以这种方式交替拍摄, 直到射击结束。
到目前为止,所有我(有帮助)提出的是:router.get('/get-data', function(req, res, next) {
var resultArray = [];
mongo.connect(url, function(err, db) {
assert.equal(null, err);
var cursor = db.collection('user-data').find();
cursor.forEach(function(doc, err) {
assert.equal(null, err);
resultArray.push(doc);
}, function() {
db.close();
res.render('index', {items: resultArray});
});
});
});`
router.post('/check', function(req, res, next) {
// var id = req.body.id;
console.log("check value");
console.log(req.body.chk);
req.body.chk=Boolean(req.body.chk);
for(i=0; i<req.body.chk;i++){
if(req.body.chk==true){
res.redirect('/');
}
else{
res.send("checkbox is not checked");
}
}
});
如何计算在1000场比赛中A或B被杀的次数?一些变量可以在A和B之间切换,然后将结果存储在列表中?
答案 0 :(得分:1)
您可以使用while语句并计算迭代次数。
射出的奇数次数= A死亡,甚至射击次数= B死亡
n <- 1000
outcomes <- cbind(rep("click",n),rep("click",n),numeric(length=n),numeric(length=n))
colnames(outcomes) <- c("finalA","finalB","nClickA","nClickB")
for (i in 1:nrow(outcomes)){
shot<-runif(1,min=0,max=1) #first shot
count <- 1
while (shot > 1/6) { #chance of dying is 1/6, so every 0 < shot < 1/6
#will be considered "death"
shot <- runif(1,min=0,max=1) #if not dead, shoot again
count <- count + 1 #and count the iterations
}
#replace "click" by "dead" for either A or B
ifelse ((count %% 2) > 0, #if count is odd number = A killed, else: B killed
(outcomes[i,1] <- "dead"), #replace the "click"s in outcomes matrix
(outcomes[i,2] <- "dead"))
#count and insert the number of clicks for each player
#if count = odd number, both had (count/2)-1 clicks
nclick <- count- 1 #the number of clicks is always the number of triggerpulls minus 1
if ((nclick %% 2) == 0) {outcomes[i,3:4] <- nclick/2
#if nclick is even number, both A and B took (nclick/2) clicks
} else {
outcomes[i,3] <- nclick/2+0.5
outcomes[i,4] <- nclick/2-0.5}
#if nclick is odd number, A took one click more than B
}
outcomes <- as.data.frame(outcomes)
table(outcomes$finalA)
table(outcomes$finalB)
编辑:如果每个A和B 的死亡概率不同,你可以在while循环中包含一个具有不同死亡概率的if语句,它将终止一次A或B死了(death=TRUE
)。
shot <- runif(1,min=0,max=1) #first shot
count <- 1
death <- logical(length=1) #new object needed to terminate the while-loop
if (shot < 0.6) {death <- TRUE} #A is already dead with p=.60
while (death != TRUE) { #if A survived the first trigger-pull, start while-loop
if (count %% 2 == 1) { #if count is odd, it's B's turn
shot <- runif(1,min=0,max=1) #next trigger-pull
if (shot < 0.8) {death <- TRUE} #B's probability of dying is .80
count <- count + 1
} else { #if count is even, it's A's turn again
shot <- runif(1,min=0,max=1)
if (shot < 0.6) {death <- TRUE}
count <- count +1
} #and this loop goes on until death = TRUE
}
编辑:如果子弹在相邻的房间内怎么办? 如果子弹在相邻的腔室中,则有六个可能的位置,两个覆盖每个腔室。第一次触发拉动有p(死亡)= 2/6。如果没有射击,我们知道两个子弹位置都不是真的,下一个触发器有p(死亡)= 1/4,依此类推。
count <- 1
k <- 5
death <- sample(c(T,T,F,F,F,F)[1:k],1)
while (death != TRUE){k <- k-1
death <- sample(c(T,F,F,F)[1:k],1)
count <- count +1}
答案 1 :(得分:1)
我理解这个模型是“继续来回交换枪,直到射击次数被射击”。我模拟了加载的腔室,就像模具的滚动一样,将“6”设置为致命的滚动
roulette <- function(numshots=1000){
killed = 6 # fatal face on a die
killshots = 0
won = 0
i = 0
while (killshots < numshots){
shot = sample(1:6, size=1, replace=T) # rolling a die
i = i + 1 # keep track of even or odd # of tries
if ( (shot == killed) ){
killshots = killshots + 1
if (i%%2 == 1){
won = won + 1
}
}
}
return(data.frame(A = won, B = numshots-won))
}
> roulette()
A B
1 502 498
答案 2 :(得分:0)
我今天早些时候看到another post关于R中更复杂的俄罗斯轮盘游戏,并决定为一个简单版本制作一个功能。在你的例子中,你有“洗牌”,因为每个转弯前都会旋转腔室。
RR <- function(PLAYERS, S = 6){
D <- 0
i <- 0
while(D != 1){
P <- sample(c(1, rep(0, times = S-1)))[1]
i <- i + 1
if(P == 1){
D <- 1
}
}
L <- rep(PLAYERS, length.out = i)[i]
L
}
在此函数中,使用while
参数进行轮次,直到有人获胜; S
是枪中的腔室数量,默认设置为6,使其成为6射手,D
编码玩家是否死亡(1)或不死(0), i
是游戏的一轮,P
是子弹在腔室中的随机位置,如果P = 1(子弹在旋转后的第一个腔室中),则玩家死亡并且游戏结束了。失败者(L
)已分配并打印。
似乎Clint Eastwood和John Wayne喜欢游戏......
> PLAYERS <- c("Eastwood", "Wayne")
> RR(PLAYERS)
[1] "Wayne"
但是10000场比赛会发生什么?
> n <- 10000
> RRres <- rep(NA, times = n)
>
> for(i in 1:n){
+ RRres[i] <- RR(PLAYERS)
+ }
>
> table(RRres)
RRres
Eastwood Wayne
5393 4607
看起来克林特自己也不应该感到如此幸运......但那是因为他总是先行先行:当你洗牌时,最后一步有一个优势,因为如果玩家(s)在你死之前,你不玩 - 游戏很可能会在几轮中结束而不是在很多轮中(概率是指一轮[n]导致killshot =(1/6)*(( 5/6)^ n),其中1/6是加载腔室的混乱风险,(5/6)^ n是某人已经失去的概率。)
因此,您可能希望使用sample
功能在每个游戏中随机化玩家的顺序:
> for(i in 1:n){
+ RRres[i] <- RR(sample(PLAYERS))
+ }
>
> table(RRres)
RRres
Eastwood Wayne
5017 4983
请注意,此功能适用于任意数量的玩家(例如26名玩家):
> for(i in 1:n){
+ RRres[i] <- RR(sample(LETTERS[1:26]))
+ }
>
> table(RRres)
RRres
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
396 362 378 368 373 388 383 398 390 372 379 382 395 393 377 389 381 386 375 379 375 382 379 430 393 397