룰렛 만들기

강냉쓰·2026년 10월 2일

강냉쓰의 흔적

목록 보기
18/22

회사에서 점심시간마다 커피 내기를 한다. flex 라는 플랫폼에서 기본 제공하는 룰렛을 사용하고있는데 언제나 확률 논란이 있었다. 정말 체감상 골고루 나온다기보다는 한쪽으로 너무나도 치우쳐서 나오는것이다.
우리는 우스갯소리로 "그냥 우리가 하나 만들까요?"라고 말하고 넘기곤 했는데 진짜 만들어봤다.

바로 이것!

나는 이런거 만들때 항상 도커 컨테이너로 크게크게 일을 키웠는데 룰렛 하나 돌리는데 굳이 컨테이너까지 갈 필요는 없었다. 간단한 정적 html 페이지로 만들었었는데 보안을 위해서 php로 변경했다.

내 룰렛의 중요한점은 서버에서 저장하는건 하나도 없게 하는것이었다. 그러기 위해선 로컬에만 저장하게 하는거였고, 또 룰렛 목록과, 또 커피내기를 하는 사람들이 항상 같지는 않기 때문에 뺐다가 추가했다가 할 수 있는 체크박스, 그 정보 또한 저장되야했었다. 로컬에!

이런 간단한건 ai로 진짜 10분만에 만들 수 있었다. 아니 10분도 안걸렸나.. 그냥 커피 기다리면서 만든거였으니까.. 그렇게 만들고 내가 개인적으로 개선하고싶은것들이 있어서 그것까지 개선해서 완성했다.

지금 홈페이지 위쪽에 보면 '룰렛'이라고 있다. 이걸 누르면 체험해볼 수 있다.

다른 용도로 쓸 수도 있을것같아 프리셋을 넣었고, 로컬 저장이기때문에 다른 디바이스에도 공유할 수 있게 export, import 도 추가했다. 확률은 단순하 math.random 을 쓰고있다. ai 가 만약 "절대 조작 불가" 를 원한다면 crypto.getRandomValues()를 쓰라고 햇는데 굳이 그럴것까지 있을까... 여기서 얘기한 "절대 조작 불가"의 뜻은 예측 불가능성, 변조 불가능성, 증명 불가능성 이 세가지를 얘기한건데

  1. 예측 불가능성
    다음에 뭐가 나올지 알 수 있는가? 이다. 사실 math.random 은 의사난수라, 출력 몇개를 관찰하면 다음 값을 예측할 수 있는 문제가 있다.
  2. 변조 불가능성
    지금 짜여진건 JavaScript 이기때문에 개발자 도구로 코드를 덮어씌울 수 있다.
  3. 증명 가능성
    이건... crypto.getRandomValues()를 써도 증명 안되잖아? 그냥 나 진짜 이걸로 했다니까? 라고 믿어줘 하는건데...

뭐 여튼 그래도 math.random의 1번 문제가 있는건 확실하지만... 나는 솔직히 골고루만 나온다면 딱히 상관없을것같다. 그리고 무슨 로또 추첨하는것도아니고.. 굳이 그렇게까지 헤비할 필요가... 2번은 어쩌피 클라이언트 코드만 조작할 수 있고 서버 코드는 당연하지만 못수정하기때문에 나만 수정하지않으면 된다. 이것도 별 문제가 아니고... 3번은 신뢰의 문제가 아닐까...

여튼 내 스펙은 이 정도라도 충분하기 때문에 그냥 이정도만 하기로 했다.

앞으로 이런 미니 도구 같은걸 더 만들 생각이다. 그런걸 모아둔 홈페이지를 따로 만들어야할까도 고민중이긴 한데... 여튼 좀 생각해봐야겠다.


원문 및 최신 수정본: 내 웹페이지

profile
개발하다가 나온 여러가지 고민과 그에 대한 해결책들을 간결하지않고 일기처럼 끄적여봅니다.

0개의 댓글