"무궁화 꽃이 피었습니다." Random 값 만들기 sample 함수 사용

   요새는 넷플릭스의 오징어 게임이 유행이다.    나도 오징어 게임을 찜 하고,  출시 되자 마자 보았다.  

  어렸을때,  놀던 놀이 들이 전부 나왔는데,  "무궁화 꽃이 피었습니다."  원래 술래가 불리한 게임이다.  

   술래가 "무궁화 꽃이 피었습니다." 라고 이야기 했는데,  움직이는 사람이 있으면,  잡히게 된다.    물론 전부 잡히게 되면,  술래가 바뀌겠지만,  술래 있는데 까지 와서,  새끼 손가락으로 잡혀 엮여 있는 사람을 풀어 준다.  

  물론 풀어 주면 도망 가는데,  도망 갈때,  술래한테,  체하는(잡히는) 사람이 술래가 된다.  어렸을때,  유일하게,  남자아이와 여자아이가 동시에 할 수 있는 게임 이다. 


하지만, 오징어 게임에서는 너무 잔인하다,  움직이면 총 맞아  죽는다. 

총성에 사람들이 놀라 도망간다. 무궁화 꽃이 피었습니다.


오늘은  R의 sample 함수를 만들어서,  놀람 정도의 값을 만들어서   많이 놀라 당황하여,  도망간 사람은 탈락하고,  그렇지 않고,  게임의 규칙을 끝까지 지킨 사람들이, 살아 남았다. 


아래는 놀람의 구간에서 1:795까지의 놀람의 기준이 있다고 가정하고,  놀람이 347이상이 되어 도망가면 탈락 된다고 가정 하였다. 

sample을  n 번 이상 실행 해도, 매번 같은 값을 줄면 seed 값을 주어야 한다. 

# random seed 값 사용하기 
set.seed(1004)


일반적인 방법에 의한 for loop 문 연산문에 의한 생존자를 계산한 것이다.   데이터 프레임을 만들어 놓고,  random sample  한 것이다.     여기에서 옵션 replace = FALSE 는 복원 추출은 하지 않은 것이다.   


# for loop 문

# 빈 데이터 프레임을 만든다. 
 sur_df <-  data.frame(no= "", s_score = "", survival ="")

  for (i in 1:456){
    x <-sample(1:795,1, replace=FALSE)
    
    if(x > 347){
      survival <- 0
    } else {
      survival <- 1
    }
  
    temp_df <- data.frame(no = i, s_score = x, survival = survival )
    sur_df <- rbind(sur_df, temp_df) 

  }

# 첫번째 행은 삭제 한다.    
 sur_df <-  sur_df[-1,]
 
# 생존자를 구한다. 
 head(sur_df)
##   no s_score survival
## 2  1     395        0
## 3  2     760        0
## 4  3     673        0
## 5  4     517        0
## 6  5     272        1
## 7  6      52        1

원래 1번 게임참석자는  게임을 규칙을 알고 있는 일남인데,  여기에는 random 샘플에 위해 생존하지 못한걸로 나와 있다. 

sum(as.integer(sur_df$survival))
## [1] 201

 위와 같이 생존자의 합을 계산 하면,  201명이 나온다.  


이건은 기초적인 방법이고,  이것 보다 약간 더 고급 적인 방법이 있다.  apply family사용인데,  apply family는 한꺼 번에 많은  Big Data를 연산하는데, 사용하는 방법론이다.   R에서는 for loop 문을 돌리면 속도가 매우 느리다.   R이 속도가 느리다고 하는 사람은 아마도 apply family를 모르는 사람일 것이다. 

#  apply faimly 사용 
# 무궁화 꽃이 피었습니다. 
# 확률 456참가  255명 사망 201명  생존율 44%
 set.seed(1004)
  survival_fun   <-  function(i){
    
    x <-  sample(1:795,1, replace=FALSE)
    
    if(x > 347){
      survival <- 0
    } else {
      survival <- 1
    }
    
    return(survival)
  }
  
  i = 1:456
  list <- t(sapply(i, survival_fun))
  survial <- apply(list, 1, sum)
  
  print(paste("전체인원 456명이 참가해서,",survial,"명이 생존 하였습니다."))    
## [1] "전체인원 456명이 참가해서, 201 명이 생존 하였습니다."

 이것도 앞에서 언급한 for 문과 같은 결과를 보여 주지만, 이 건은  연산 속도가 어느 것보다 빠르다는 특징을 가지고 있다.   




댓글 없음:

댓글 쓰기

css cheat sheet 클래스 선택자, margin(마진), display , center 조정 간단한 구성 요소

 앞에서는 html의 간단한 sheet를 소개 하였습니다.   html은  주로 골격을 나타나는 것이라, 디자인을 하는데는 css로 하여야 합니다.  아래 코드와 같이 css 관련 하여 매우 간단하게 코딩 하겠습니다.  body 부분의 css 코딩  ...