개발자_이훈규
천천히, 빠르게. 개발자의 Repository
개발자_이훈규
전체 방문자
오늘
어제
  • 분류 전체보기 (473)
    • 티스토리 (4)
    • 개발자 뉴스 (2)
    • 소프트웨어 (203)
      • C (7)
      • c++ (25)
      • Objective-C (3)
      • Do it! 반응형 웹디자인 (4)
      • openGL (8)
      • Java (24)
      • Jni (3)
      • Android (9)
      • Wordpress (2)
      • 버그 만난 후 느낀점 (2)
      • Git (3)
      • node js (2)
      • window tablet (1)
      • HTML (3)
      • javascript (3)
      • perl (1)
      • AngularJS (0)
      • JSON (0)
      • Docker (3)
      • python (5)
      • jQuery (1)
      • MFC (4)
      • cocos studio (6)
      • Golang (1)
      • SQLite3 (0)
      • Spring Boot (8)
      • thymeleaf (0)
      • Django (0)
      • iOS (3)
      • skia (0)
      • VBA (0)
      • PHP (2)
      • Oracle (1)
      • JSP (0)
      • R (0)
    • TCP IP (2)
    • 금융 (0)
      • 금융 Study (0)
      • 금융 Archive (0)
      • 금융 Article (0)
    • 개인 프로젝트 (7)
      • gif 홈페이지 만들기 (0)
      • study app만들기 (0)
      • 크롤러 만들기 (1)
      • 카툰 홈페이지 만들기 (1)
      • 외주 홈페이지 만들기 (3)
      • 웹 홈페이지 만들기 (0)
      • 미디어 서버 만들기 (0)
      • 소개팅 어플 만들기 (0)
      • 인스타그램 풀스택 클론 코딩(인강 노트) (0)
      • 주식 모의거래 만들기 (1)
    • html php mysql (0)
    • node.Js (2)
    • 일상 (2)
    • 빈공간 uml 공부 (0)
    • Ubuntu(linux) (12)
    • 맥OS (10)
      • android 설치하기 (2)
    • Programming quizzes (0)
    • IoT (구 유비쿼터스) (16)
      • 라즈베리 파이 (11)
      • 아두이노 (5)
    • 하드웨어 (5)
      • 아수스 비보탭 노트8 asus vivotap no.. (2)
      • 크레마 카르타 (3)
    • 분석할 문장, 구문, 코드 (0)
    • 키보드 (1)
      • 해피해킹 (1)
    • 코드 라이언 (0)
    • 전자기기 (4)
    • Ted (0)
    • NAS (0)
    • 알고리즘 (0)
    • 연합인포맥스 (0)
    • 이벤트 응모함 (4)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • error
  • 개발
  • GIT
  • 라즈베리 파이
  • ubuntu
  • C++
  • 코드
  • 예제
  • install
  • CODE
  • 소스
  • Java
  • 우분투
  • 설명
  • C
  • Python
  • 방법
  • 설치
  • 에러
  • Example

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
개발자_이훈규

천천히, 빠르게. 개발자의 Repository

카테고리 없음

Shuffle에 대해서

2022. 9. 22. 09:51

shuffle이라는 말은 임의로 섞는다는 의미이다. mp3에서 임의로 노래의 순서를 섞어서 플레이할 때 사용되기도 한다. 더 많은 내용은 키워드 'random permutation'혹은 'the algorithm shuffles the sequence' 으로 살펴볼 수 있다. 아래는 그 이론에 대한 내용과 구현에 대해서 살펴본다.

shuffle 이론들

1.  Fisher-Yates shuffle

def shuffle(a):
    n = len(a)
    for i in range(n - 1):  # i from 0 to n-2, inclusive.
        j = random.randrange(i, n)  # j from i to n-1, inclusive.
        a[i], a[j] = a[j], a[i]  # swap a[i] and a[j].

2. Sattolo algorism
Fisher-Yates의 변형으로 큰 틀은 비슷하지만 random의 범주가 줄어든다는 특징이 있다. 그래서 bias가 증가한다.

def sattolo(a):
    n = len(a)
    for i in range(n - 1):
        j = random.randrange(i+1, n)  # i+1 instead of i
        a[i], a[j] = a[j], a[i]

3. inside-out algorism

Fisher-Yates의 변형으로 Fisher-Yates는 원본 배열을 swap하는 형태라면 inside-out은 원본 배열은 변경하지 않고 새로운 배열을 만들어 결과를 저장하는 알고리즘이다.

    1) 하나의 배열에서 새로운 랜덤 배열 만들기

To initialize an array a of n elements to a randomly shuffled copy of source, both 0-based:
  for i from 0 to n − 1 do
      j ← random integer such that 0 ≤ j ≤ i
      if j ≠ i
          a[i] ← a[j]
      a[j] ← source[i]

    2) 여러개의 소스 배열에서 랜덤 배열 만들기

To initialize an empty array a to a randomly shuffled copy of source whose length is not known:
  while source.moreDataAvailable
      j ← random integer such that 0 ≤ j ≤ a.length
      if j = a.length
          a.append(source.next)
      else
          a.append(a[j])
          a[j] ← source.next

추가적인 개념

  1. Cyclic permutation
  2. Reservoir sampling

결론

스포티파이의 shuffle사례에서 보듯이 실제 사용자에게는 단순한 shuffle이 아니라 cluster분류가 균등한 shuffle이 필요하다. 또한 머신러닝 분야에서는 데이터 범위가 매우 큰 범위에서 임의의 sampling을 하는 부분에서도 활용되고 있다. 따라서 실제로 비즈니스에서 shuffle을 사용한다면 랜덤한 데이터를 사용할 클라이언트(사람 혹은 AI)가 원하는 목적에 따라서 별도의 로직을 추가해야겠다.

Reference

  1. https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
  2. https://danluu.com/sattolo/
  3. Shuffle 활용 - https://yamalab.tistory.com/136
    1. https://engineering.atspotify.com/2014/02/how-to-shuffle-songs/
  4. Reservoir sampling - https://en.wikipedia.org/wiki/Reservoir_sampling
저작자표시 (새창열림)
    개발자_이훈규
    개발자_이훈규
    혼자 꽁양꽁양 개발하면서 놀아요~ - 노트같은 블로그

    티스토리툴바