>

클래스 주사위 시뮬레이션 문제가 있는데, R 구문이 처음이기 때문에 구현하기 위해 고군분투하고 있습니다. 이 함수 (simu라고 함)는 다음과 같이 작동합니다.

<올>
  • 0 점으로 시작
  • 세 개의 6면 주사위로 n 개의 무작위 추첨 시뮬레이션
  • 각 추첨마다 :
    • 세 주사위의 합이>12->+1 포인트 인 경우
    • 세 주사위의 합이<6->-1 점인 경우
    • 그렇지 않으면 (즉, 6과 12 사이의 합) :
      • 3 개의 주사위가 같은 수인 경우->+5 점
      • 그렇지 않으면->0 포인트
  • n 번의 시뮬레이션이 끝났을 때 얻은 총 포인트 수를 반환합니다
  • 여러 가지 다른 방법을 시도해 보았는데 꽤 가깝습니다 :

    simu <- function(n){
      k <- 0
      for(i in 1:n) {
        a <- sample(y,1,replace=TRUE)
        b <- sample(y,1,replace=TRUE)
        c <- sample(y,1,replace=TRUE)  
        if ((a + b + c) > 12)  {
          k <- k+1
        } else if ((a + b + c) < 6)  {
          k <- k-1
        } else if ((a == b) & (b == c))  {
          k <- k+5
        } else k <- 0
      }
      return(k)
    }
    
    
    문제는 함수의 각 "i"에 대해 새로운 시뮬레이션 (a, b, c)을 반복하지 않는 것 같습니다.


    • 답변 # 1

      내가 찾은 유일한 문제에 대해 언급했다 ... 마지막 else  항상 k 를 다시 초기화하는  대신에 그것은 k <- k + 0 이어야했다  하지만 제거 할 내용은 변경되지 않습니다.

      y <- seq(1,6) # 6-sided dice
      simu <- function(n){
        k <- 0
        for(i in 1:n) {
          a <- sample(y,1,replace=TRUE)
          b <- sample(y,1,replace=TRUE)
          c <- sample(y,1,replace=TRUE)  
          if ((a + b + c) > 12)  {
            k <- k+1
          } else if ((a + b + c) < 6)  {
            k <- k-1
          } else if ((a == b) & (b == c))  {
            k <- k+5
          } #else k <- 0
        }
        return(k)
      }
      
      

      결과는 꽤 좋아 보인다 :

      > simu(1000)
      [1] 297
      > simu(100)
      [1] 38
      
      

    • 답변 # 2

      R을 사용하려면 'for'루프 대신 벡터화 된 연산을 만드는 법을 배워야합니다. 다음은 계산하는 데 1 초 미만의 백만 롤 주사위의 시뮬레이션입니다. 'for'루프 접근법이 얼마나 오래 걸 렸는지 잘 모르겠습니다.

      n <- 1000000  # trials
      start <- proc.time()  # time how long it takes
      result <- matrix(0L, ncol = 6, nrow = n)
      colnames(result) <- c('d1', 'd2', 'd3', 'sum', 'same', 'total')
      # initial the roll of three dice
      result[, 1:3] <- sample(6L, n * 3L, replace = TRUE)
      # compute row sum
      result[, 'sum'] <- as.integer(rowSums(result[, 1:3]))
      # check for being the same
      result[, 'same'] <- result[,1L] == result[, 2L] & result[, 2L] == result[, 3L]
      result[, 'total'] <- ifelse(result[, 'sum'] > 12L,
                            1L,
                            ifelse(result[, 'sum'] < 6L,
                                   -1L,
                                   ifelse(result[, 'same'] == 1L,
                                          5L,
                                          0L
                                   )
                            )
      )
      table(result[, 'total'])
          -1      0      1      5 
       46384 680762 259083  13771 
      cat("simulation took:", proc.time() - start, '\n')
      simulation took: 0.7 0.1 0.8 NA NA
      
      

    • 답변 # 3

      필요한 것이 확실하지 않지만 다음과 같이 시도해 볼 수 있습니다.

      # Draw the dice(s) - returns vector of length == n_dices
      draw <- function(sides = 6, dices = 3){
        sample(1:sides, dices, replace = T)
      }
      # test simulation x and return -1, 0, 1, 1 or 5
      test <- function(x){
        (sum(x) > 12)*1 + (sum(x) < 6)*(-1) + (sum(x) >= 6 & 
                                                 sum(x) <= 12 & 
                                                 var(x) == 0)*5 
      }
      # simulate n draws of x dices with y sides
      simu <- function(sides = 6, dices = 3, n = 100){
        sum(replicate(n, test(draw(sides, dices))))
      }
      # run simulations of 100 draws for 1, 2, ..., 11, 12-side dices (3 dices each simulation) 
      dt <- lapply(1:12, function(side) replicate(100, simu(side, 3, 100)))
      # plot dicstribution of scores
      par(mfrow = c(3,4))
      lapply(1:length(dt), function(i) hist(dt[[i]],
                                            main = sprintf("%i sides dice", i),
                                            xlab = "Score"
                                            )
             )
      
      

  • 이전 android - recyclerview 위에 버튼을 추가하는 방법
  • 다음 asp.net - gridview에서 확인란을 선택한 경우 데이터베이스에 날짜 추가