홈>
클래스 주사위 시뮬레이션 문제가 있는데, R 구문이 처음이기 때문에 구현하기 위해 고군분투하고 있습니다. 이 함수 (simu라고 함)는 다음과 같이 작동합니다.
<올>- 세 주사위의 합이>12->+1 포인트 인 경우
- 세 주사위의 합이<6->-1 점인 경우
- 그렇지 않으면 (즉, 6과 12 사이의 합) :
- 3 개의 주사위가 같은 수인 경우->+5 점
- 그렇지 않으면->0 포인트
여러 가지 다른 방법을 시도해 보았는데 꽤 가깝습니다 :
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
- 답변 # 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" ) )
트렌드
- OpenCv의 폴더에서 여러 이미지 읽기 (python)
- 파이썬 셀레늄 모든 "href"속성 가져 오기
- html - 자바 스크립트 - 클릭 후 변경 버튼 텍스트 변경
- javascript - 현재 URL에서 특정 div 만 새로 고침/새로 고침
- JSP에 대한 클래스를 컴파일 할 수 없습니다
- JavaScript 변수를 HTML div에 '출력'하는 방법
- git commit - 자식 - 로컬 커밋 된 파일에 대한 변경을 취소하는 방법
- jquery - JavaScript로 현재 세션 값을 얻으시겠습니까?
- javascript - swiperjs에서 정지, 재생 버튼 추가
- python - 화면에서 찾은 요소를 찾을 수없는 경우 셀레늄
내가 찾은 유일한 문제에 대해 언급했다 ... 마지막
else
항상k
를 다시 초기화하는 대신에 그것은k <- k + 0
이어야했다 하지만 제거 할 내용은 변경되지 않습니다.결과는 꽤 좋아 보인다 :