1. 컴퓨터는 진짜 난수를 생성할수 없음
2. 메운디가 사용하는 선형합동법으로 생성된 난수는 시드에 따라 나오는 값이 정해져 있음(당연한거)
3. 놀랍게도 몇명이서 하던 확률 자체는 같음
1 난수
컴퓨터는 진짜 난수를 생성할수 없음, 난수처럼 보이게 만든 유사 난수일 뿐임
대부분의 난수 알고리즘이 시드에 의존적이고 시드를 알고 있다면 다음에 올 수 또한 당연히 알 수 있음
하지만 일부러 시드를 찾아서 보는게 아닌 이상 여전히 이 다음에 뭐가 나올진 알 수 없음 (= 미래가 정해져 있다고 보기는 어렵다)
매 뽑기 이후 srand를 하는것도 개인적으론 의미가 없다고 생각함
2 선형합동법
1 2 3 4 5 6 7 8 9 10 | void srand(int seed) { _seed = seed; } int rand() { _seed = _seed * 214013 + 2531011; return _seed >> 16 & 0x7FFF; } | cs |
(Windows에서 사용하는 rand, 메운디는 2바이트 2바이트 합쳐서 4바이트를 쓰고 상수가 다른거 빼면 같음)
결국
- 시작값(시드)을 지정한다
- 시드 * 214013 + 2531011 은 새 시드가 된다
- (시드 / 65536) & 32767 을 반환한다 (뽑기확률)
가 되는데 시작 시드를 알면 n번째 수도 당연히 알 수 있는 구조임
이건 잘못된게 아님
3 여럿이서 하면 확률이 낮다?
솔직히 왜 이런 소리가 나오는지 모르겠음
난수표를 공유하던 공유하지 않던 나올 확률은 똑같음
태초 뒤에 바로 태초가 있는게 불가능한것도 아니고
애초에 이런거 물어볼 정도면 죽을때까지 메운디 하는 지능이 맞으니까 불평 말고 플레이 하시길
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | srand(int.MaxValue); int value = 0; for (int i = 0; i < 10000000; i++) { if (i % 2 == 1) { value = rand() % 1000; if (value == 1) { oddCount++; } } else { value = rand() % 1000; if (value == 1) { evenCount++; } } } Console.WriteLine($"홀수 플레이어: {oddCount}"); Console.WriteLine($"짝수 플레이어: {evenCount}"); | cs |
결과:
홀수 플레이어: 5024
짝수 플레이어: 5025
확률 이해 못하는 저능아가 이거 보고 이해하겠음? 저능아 수준에 맞는 설명을 하셈...
하긴 메이플도 강환불 영환불도 '가중치'기반이라 해놓고 테이블 돌린건데 뭐
그건 이거랑 좀 다름 메이플 환불 오류는 복수의 옵션 리스트를 만들고 그중 하나를 주던건데 특정 옵션이 나올 확률이 정확히 같지 않은게 문제였지 다른 온라인 게임의 뽑기도 다 저런 유사난수 기반으로 돌아감