【问题标题】:Lotto function with RR 的乐透功能
【发布时间】:2014-10-07 13:10:17
【问题描述】:

我刚刚生成了 10 个从 1 到 39 的随机乐透号码,现在我想检查这些号码是否与我的中奖彩票匹配,例如 w<-c(2,8,19,23,25,32,37),这样如果我有 3 场比赛特别组合,则奖金为 4 50 的 10 美元5 100 美元 6 2000 美元和所有 7 100000 美元。

    set.seed(99)
    y <- replicate(10,sample(1:39,7,replace=FALSE))
    dimnames(y) <- list(rownames(y,do.NULL=FALSE,prefix=""),
                        colnames(y,do.NULL=FALSE,prefix="Combination"))
    m <- t(y)
    (m2 <- t(apply(m,1,sort)))

                   [,1] [,2] [,3] [,4] [,5] [,6] [,7]
    Combination1     5   19   23   26   33   36   39
    Combination2     7   12   14   18   20   22   37
    Combination3     4    7    8   14   25   27   36
    Combination4     1    4   13   22   27   28   32
    Combination5     1    2    8   12   13   19   37
    Combination6    16   18   22   27   30   31   35
    Combination7    13   15   18   20   31   34   36
    Combination8     5   10   27   28   29   31   35
    Combination9     4   10   14   21   23   33   35
    Combination10    1   17   20   28   29   32   33

【问题讨论】:

    标签: r simulation


    【解决方案1】:

    收到的答案都是正确的。我只想指出%in%is.element 基本上是相同的功能。但是,不需要任何apply。请记住,apply 只是隐藏了一个for 循环,并且与矢量化的内部 R 函数相比非常慢。我只是建议:

      rowSums(matrix(m %in% w, ncol=ncol(m)))
    

    这可以更快:

      m<-t(replicate(100000,sample(39,7)))
      system.time(res<-apply(m,1,function(x) sum(x%in%w)))
      #  user  system elapsed 
      # 0.584   0.000   0.587
      system.time(res2<-rowSums(matrix(m %in% w, ncol=ncol(m))))
      #  user  system elapsed 
      # 0.036   0.004   0.040 
      all.equal(res,res2)
      #[1] TRUE
    

    【讨论】:

      【解决方案2】:

      您应该使用is.element 函数。 is.element 为w 的每个元素提供一个布尔值,判断该元素是否是m2[1,] 的一部分。然后你可以对is.element 给出的布尔向量求和。这个总和为您提供了您正在寻找的内容:属于m2[1,]w 的元素数。

      sum( is.element(w,m2[1,]) )
      

      当您对m2 的每一行重复操作时,is.element 函数必须与 for 循环或apply 函数结合使用。

      colSums(apply(m2, 1, is.element, el=w))
      

      PS:它也适用于mycolSums(apply(m, 1, is.element, el=w))colSums(apply(y, 2, is.element, el=w))

      【讨论】:

        【解决方案3】:

        您可以使用%in% 获取匹配项的逻辑向量并将其相加。

        apply(m2,1,function(x) sum(x%in%w))
         Combination1  Combination2  Combination3  Combination4  Combination5 
                    2             1             2             1             4 
         Combination6  Combination7  Combination8  Combination9 Combination10 
                    0             0             0             1             1
        

        奖金金额:

        c("0$","0$","0$","10$","50$","100$","2000$","100000$")[apply(m2,1,function(x) sum(x%in%w))+1]
         [1] "0$"  "0$"  "0$"  "0$"  "50$" "0$"  "0$"  "0$"  "0$"  "0$"
        

        暂时不要退休。

        【讨论】:

          猜你喜欢
          • 2015-06-30
          • 2015-06-20
          • 1970-01-01
          • 2019-05-12
          • 1970-01-01
          • 1970-01-01
          • 2021-05-04
          • 1970-01-01
          • 2012-10-30
          相关资源
          最近更新 更多