아래 글을 포함해 모든 개발은 aws-q-cli로 만들어졌습니다
https://galton-board-demo.s3.ap-northeast-2.amazonaws.com/index.html
안녕하세요! 오늘은 웹 기술을 활용하여 갈튼 보드(Galton Board) 시뮬레이션을 개발한 과정을 공유하려고 합니다. 갈튼 보드는 통계학에서 이항 분포와 정규 분포를 시각적으로 보여주는 도구로, 공이 핀을 통과하면서 자연스럽게 종 모양의 분포를 형성하는 것을 관찰할 수 있습니다.
처음에는 HTML, CSS, JavaScript를 별도의 파일로 나누어 개발했습니다. 기본적인 구조는 다음과 같습니다:
초기 버전에서는 핀의 배치가 완벽한 삼각형 형태가 아니었습니다. 사용자 피드백을 받아 핀의 배치를 개선했습니다:
// 완벽한 삼각형 패턴으로 핀 생성
for (let row = 0; row < rows; row++) {
// 각 행에는 row+1개의 핀이 있음 (1, 2, 3, 4 등)
for (let col = 0; col <= row; col++) {
const peg = document.createElement('div');
peg.className = 'peg';
// 완벽한 삼각형을 형성하기 위한 위치 계산
const triangleWidth = boardWidth * 0.7;
const rowWidth = triangleWidth * (row + 1) / rows;
const pegSpacing = rowWidth / (row || 1);
const leftOffset = (boardWidth - rowWidth) / 2;
peg.style.left = `${leftOffset + col * pegSpacing}px`;
peg.style.top = `${pegAreaHeight * 0.2 + (pegAreaHeight * 0.7 / rows) * row}px`;
pegContainer.appendChild(peg);
}
}
공이 핀을 통과하는 과정을 더 자연스럽게 시뮬레이션하기 위해 경로 계산 알고리즘을 개선했습니다:
// 경로 미리 계산
let path = [];
let currentPosition = 0;
for (let row = 0; row < rows; row++) {
// 각 핀에서 50% 확률로 오른쪽으로 이동
if (Math.random() > 0.5) {
currentPosition++;
}
path.push(currentPosition);
}
"50개 공 낙하" 버튼을 클릭하면 여러 개의 공이 순차적으로 떨어지도록 구현했습니다:
function dropMultipleBalls(count) {
if (dropMultipleActive) return;
let remaining = count;
dropMultipleActive = true;
function tryDropNext() {
if (remaining > 0 && dropMultipleActive) {
if (dropBall()) {
remaining--;
}
if (remaining > 0) {
setTimeout(tryDropNext, 50);
} else {
dropMultipleActive = false;
}
}
}
tryDropNext();
}
배포를 간소화하기 위해 HTML, CSS, JavaScript를 하나의 파일로 통합했습니다. 이렇게 하면 S3와 같은 정적 호스팅 서비스에 쉽게 배포할 수 있습니다.
프로젝트를 AWS S3에 배포하기 위한 CloudFormation 템플릿도 작성했습니다:
AWSTemplateFormatVersion: '2010-09-09'
Description: 'CloudFormation template to deploy Galton Board as a static website on S3'
Resources:
S3Bucket:
Type: AWS::S3::Bucket
DeletionPolicy: Retain
Properties:
BucketName: !Ref BucketName
AccessControl: PublicRead
WebsiteConfiguration:
IndexDocument: index.html
ErrorDocument: index.html
최종 결과물은 다음과 같은 기능을 제공합니다:
이 프로젝트를 통해 다음과 같은 것들을 배웠습니다:
이 프로젝트는 통계학의 기본 개념을 시각적으로 이해하는 데 도움이 되는 교육용 도구로 활용될 수 있습니다. 소스 코드는 GitHub에서 확인할 수 있으며, 누구나 자유롭게 사용하고 개선할 수 있습니다.
갈튼 보드 시뮬레이션 프로젝트를 통해 웹 기술과 통계학의 만남을 경험할 수 있었습니다. 이 프로젝트가 다른 개발자들에게도 영감이 되길 바랍니다!