家庭作业:使用R模拟硬币投掷直到连续的头部

时间:2014-01-27 21:51:20

标签: r matlab probability

我是R的新手因此在这里询问(未能找到非常有用的详细仿真教程。)

问题陈述是这个

  1. 模拟掷硬币20次并记录头数 &安培;最长的头。
  2. 模拟掷硬币并记录所需的翻转次数,直到2,3,4个头依次出现(连续)(负二项式?)
  3. 使用不同种子进行100次运行,以查找记录的项目分布。
  4. 如何在编程语言R中解决这个问题?

    对于1,我做了以下事情:

    n=20                #no of trials
    y=NULL              #initializing a vector of NULL values   
    for (i in 1:n) {
        x=runif(1)      #random uniform
        if (x<0.5) {    #if condition for assigning heads / tails
            y[i]='H'
        } else {
           y[i]='T'
        }
    }
    y                   #print the vector storing the heads and tails.
    

    对于2,我理解这是负二项式的情况,因为它说“直到2,3,4个头按顺序出现”。但我不知道如何继续在R中编写代码或提出逻辑。

    对于3,我猜测必须计算100次运行得到的头数,运行长度。但它设置不同的种子意味着什么呢?我不确定。

    注意这是一个家庭作业问题,是的(我无法对其进行标记)。我不需要代码,只需一些指示/更正/澄清/建议会有所帮助。

    编辑为了模拟2,我在MATLAB上尝试了以下代码 -

    head_count = 0;
    flip_count = 0;
    
    while (head_count < 3)                  #counting for 3 multiple heads
        flip = rand(1);
        flip_count = flip_count+1;
        if (flip > 0.5)
            head_count = head_count + 1;
        else 
             head_count = 0;       #invalidate head counts if not successive.
        end
    end
    disp(flip_count)
    

    如果这个逻辑是正确的,请告诉我。我可以使用R。

    重新创建它

1 个答案:

答案 0 :(得分:1)

由于这是作业,我想给你一些关于#2和#3的指示。

对于#2,做一个循环,它继续做硬币投掷并计算连续的头数。每次投掷都会将投掷次数增加1,当达到要求的投掷次数时,只需返回投掷次数。

为了让你入门,这将是nbTosses tossesL

coin <- c('h','t')

ComputeNbTosses <- function(targetTosses) {
  nbtosses = 0;
  while (nbtosses < targetTosses) {
    nbtosses = nbtosses + 1
  }
  return(nbtosses);
} 

您只需要修改它以接收参数targetHeads并仅在到达tagetHeads时退出while循环。

对于#3,将#2放入函数中,然后使用set.seed(integer)来设置种子。计算机上的随机数并不是随机的。大多数随机生成器允许您设置种子。如果你使用相同的种子,你将得到两倍相同的伪随机数序列,这允许调试。

编辑:我将#2从递归更改为正常循环,为他编码会更容易。

编辑(提示): 这将计算你有多少个头,现在你必须在达到头的目标值时停止循环:

coin <- c('h','t')

ComputeNbTosses <- function(targetTosses) {
  nbTosses = 0;
  nbHeadsInRow = 0;
  allTosses = c();
  while (nbTosses < targetTosses) {
    toss = sample(coin,1,T)
    allTosses = c(allTosses, toss);
    if (toss == 'h') {
      nbHeadsInRow = nbHeadsInRow + 1;
    } else {
       nbHeadsInRow = 0;
    }
    nbTosses = nbTosses + 1
  }
  ret = list();
  ret$nbTosses = nbTosses;
  ret$nbHeadsInRowAtEnd = nbHeadsInRow;
  ret$allTosses = allTosses;
  return(ret);
} 

ComputeNbTosses(5);
ComputeNbTosses(8);

这将打印出达到nbTosses时的行数。这不是你想要的。你想要的是:

  • 将参数从targetTosses更改为targetHeadsInRow
  • 更改while中的条件,以便在nbHeadsInRow到达targetHeadsInRow时停止。
  • 您需要返回的是nbTosses(达到您条件的投掷次数)

如果有什么不清楚,请告诉我。