주택청약, 게임아이템 확률 드랍, 로그인 캡챠 랜덤값등 실생활에 컴퓨터로 난수를 만드는 일은 너무나많다.
생성된 난수는 항상 공평한지, %로 표기된 확률은 항상 맞는지가 궁금해졌다.
특히 게임드랍률과 같은 알고리즘은 짧은 순간에 어떻게 계산할지 항상 궁금했다.
정확한 알고리즘은 흔히 말하는 영업비밀로 치부되므로 궁금증 해소정도로만 알아보도록 하겠다.
1. 가중치 랜덤 알고리즘
1. 주어진 데이터를 가중치의 오름차순으로 정렬
2. 랜덤 기준값을 정하고, 정렬된 데이터를 순회하며 각 가중치를 누적하다가 기준값 이상이 되면 종료
- 아이템은 중복되게 추가할 수 없다.
2. 타임테이블(시드 값)을 사용한 랜덤
- 컴퓨터가 랜덤으로 숫자를 생성하려면 뭔가 기준이 되는게 필요하다(시드값) 보통 그 기준을 시간으로 많이 잡는다.
- 기준을 동일하게 넣으면 랜덤함수 결과 값이 같은 패턴으로 출력한다.
- 의도적으로 기준(시드)값에 특정값을 넣고 일정한 패턴이 반복되도록 시스템을 만든 경우 랜덤확률을 조작가능하다.
3. Math.random()
대부분 xorshift128+ 알고리즘을 쓴다.
XOR(Exclusice OR, 배타적 논리합)연산
Shift 연산은 비트를 오른쪽(>>), 또는 왼쪽(<<)으로 옮기는 연산을 수행합니다.
변수 << 이동할 비트 수의 형식으로 예를 들어 << 1은 왼쪽으로 1개씩 모두 옮기며 남은 비트에는 0을 채웁니다.
7라인 . : [1]번 인덱스에 있던 값을 [0]번 인덱스로 옮긴다.
7~10라인 : XOR 연산을 통해 난수를 만든다
11라인 : [1]번 인덱스에 난수를 넣는다.
13라인 : 두 원소를 더해서 출력한다.
그리고 시프팅하는 상수인 23, 17은 XOR 시프팅 128+ 알고리즘을 개발할 때 연구를 통해 찾아낸 최적의 상수이기 때문에 사용하는 것
'정보' 카테고리의 다른 글
자본주의 서평(1) (1) | 2024.01.01 |
---|---|
엔화..? (1) | 2023.11.12 |
창업 겉핥기 (1) | 2023.10.22 |
세이노의 가르침 서평(2) (0) | 2023.05.21 |
세이노의 가르침 서평(1) (1) | 2023.05.14 |