---C++ 역량 강화---/STL 공부

shuffle

코리아탑클 2024. 5. 31. 11:17

[[[문제]]] shuffle함수를 이용하여 요소들의 위치를 섞어보자

 

[[[원리 분석]]]

랜덤 엔진을 사용해서 무작위로 값을 섞는다.

==헤더 파일==

#include <iostream>
#include <numeric>
#include <random>
#include <vector>
#include <print>

==소스 코드==

https://koreatopclass.tistory.com/20 << 랜덤 엔진 참고

https://koreatopclass.tistory.com/18 << iota 참고

올바르게 섞였다.

==함수 구현==

함수 구현을 해보고 싶어졌다. 감이 잘 안오는데...

c++ reference에 있는 샘플 코드를 가져왔다.

1. difference_type diff_t로 설정해준 이유는 iterator의 뺄셈이 가능하도록 하기 위해서다.

그러니까, 특정 iterator의 거리 차이를 구할 수 있도록 difference_type을 재 설정 해준 것이다.

 

2. swap은 마지막 인덱스부터 처음 인덱스 까지 순서대로 스왑할 기회를 얻는다.

그러니까, vector size가 10이었다면 [i = 9;  i > 0;  --i] 이렇게 될 것이고

9, 8, 7 ...1까지 모든 요소들이 반드시 스왑된다.

 

3.first[i]는 시작 주소 + i의 값

 

4.first[r(i + 1)])는 예를들어 i가 맨 마지막 인덱스인 9였다고 하면 first[r(10)]이 되는데 랜덤 엔진 r(10)의 의미는 0 ~ 9 사이의 랜덤한 값을 뽑아 내는 것. 즉 first[ 0 ~ 9]가 된다.

 

5.swap(first[i], first[0 ~ i]를 스왑하는 것이다.

원리를 이해하고 나니까 쉽다.

 

학습 장소: 한국공학대학교 게임공학과 수업

참고: https://en.cppreference.com/w/

'---C++ 역량 강화--- > STL 공부' 카테고리의 다른 글

class 대신 struct 쓰는 이유  (0) 2024.05.31
partition, nth_element, partitial_sort, sort  (0) 2024.05.31
default_random_engine, distribute, random_device  (0) 2024.05.31
print, format  (0) 2024.05.31
iota  (0) 2024.05.31