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바이트를 쓰고 상수가 다른거 빼면 같음)

결국
  1. 시작값(시드)을 지정한다
  2. 시드 * 214013 + 2531011 은 새 시드가 된다
  3. (시드 / 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
(1천분의 1(0.1%)짜리 뽑기를 두 플레이어가 번갈아가며 1천만회 뽑는 코드)

결과:
홀수 플레이어: 5024
짝수 플레이어: 5025