在R中创建俄罗斯轮盘游戏

时间:2017-10-06 13:59:00

标签: r

我想知道是否有人可以帮我在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之间切换,然后将结果存储在列表中?

3 个答案:

答案 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是某人已经失去的概率。)

enter image description here

因此,您可能希望使用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