확률과 통계

순열 플레이그라운드

값을 바꾸며 직접 움직여 보는 manim 스타일 실험실 · 각 탭 아래에 같은 장면을 만드는 manim 코드

설정

4

위에서부터 시계 방향으로 읽기

회전 버튼을 눌러 읽은 문자열을 모아 보기

계산

일렬로 세우는 경우 n! 회전하여 같은 배열 수 n 원순열 (n − 1)!
manim 코드로 만들어 보기 · CircleRotate
class CircleRotate(Scene):
    def construct(self):
        center = LEFT * 3.2 + DOWN * 0.1
        theta = ValueTracker(0)                 # 회전 각도
        people = VGroup()
        for i, l in enumerate("ABCD"):          # ← "ABCDE"로 바꾸면 5명
            p = person(l, RED if l == "A" else BLUE)
            p.add_updater(lambda m, i=i: m.move_to(
                seat(center, 2.0, i, 4, theta.get_value())))
            people.add(p)
        self.play(FadeIn(table(center)), LaggedStart(*[GrowFromCenter(p) for p in people]))
        for k in range(1, 4):
            self.play(theta.animate.set_value(k * PI / 2))   # 90°씩 회전

로컬 실행: python -m manim -pqm scripts/w01_anim.py CircleRotate · 전체 코드 scripts/w01_anim.py

바꿔 볼 것: 사람 수를 5명으로 늘리고 회전 각도를 k * TAU / 5로 바꾸기

설정

2 3

후보는 0, 1, …, n − 1 · 같은 숫자를 다시 써도 되는 중복순열

계산

manim 코드로 만들어 보기 · Repeated
for L in range(3):                      # ← 깊이(비트 수)
    n = 2 ** (L + 1)                    # ← 2 대신 3이면 삼진 트리
    for k in range(n):
        parent = prev[k // 2]
        edges.add(Line(parent, p, color=LINE).set_z_index(-1))
        nodes.add(VGroup(circle, T(str(k % 2), 26)))
    self.play(Create(edges), LaggedStart(*[GrowFromCenter(nd) for nd in nodes]))

로컬 실행: python -m manim -pqm scripts/w01_anim.py Repeated

바꿔 볼 것: 가지 수를 3으로 바꿔 3 ** (L + 1), 부모 인덱스를 k // 3으로

나열할 문자 (최대 8글자)

계산

manim 코드로 만들어 보기 · SameThings
pattern = "abaab"                       # ← 다른 배열로 바꿔 보기
rows = VGroup()
for pa in permutations([1, 2, 3]):      # a 3개의 첨자 순서 3! 가지
    for pb in permutations([1, 2]):     # b 2개의 첨자 순서 2! 가지
        ia, ib = iter(pa), iter(pb)
        rows.add(tile_row(pattern, [next(ia) if c == "a" else next(ib) for c in pattern]))
# 첨자를 지우면 12줄이 모두 같은 1줄로 합쳐짐
self.play(*[ReplacementTransform(r, plain.copy()) for r in rows])

로컬 실행: python -m manim -pqm scripts/w01_anim.py SameThings

설정

4 2

경로 = a, b 문자열

버튼을 눌러 보기

각 점까지의 경로 수 = 왼쪽 점 + 아래쪽 점 (파스칼 삼각형과 같은 규칙)

manim 코드로 만들어 보기 · ShortestPath
for d in range(7):                      # 대각선 순서로 채우기
    for i in range(5):                  # ← 가로 4칸이면 range(5)
        j = d - i
        if 0 <= j <= 2:                 # ← 세로 2칸
            v = comb(i + j, i)          # 그 점까지의 최단 경로 수
            labs.append(VGroup(bg, T(str(v), 24)))
    self.play(LaggedStart(*[GrowFromCenter(l) for l in labs]))

로컬 실행: python -m manim -pqm scripts/w01_anim.py ShortestPath

바꿔 볼 것: 가로 5칸, 세로 3칸으로 늘리고 B 위치를 P(5, 3)으로