<aside> 💡 식을 위해서 주어지는 R0 이 필요하다. 이것을 씨앗 (Seed) 라고 한다.

</aside>

이론

Untitled

즉, 어떤 수를 M으로 나눈 나머지는 항상 0 이상 M-1 이하의 값을 가지므로 모듈러 연산의 결과는 0 에서 M-1 이 된다.

Untitled

수식

$$ R_{i+1} = (A \times R_i + B) \% M $$

그럼 최대 M 의 주기를 가지게 된다.

코드

#include <iostream>

// 유사 난수 생성기 PRNG
// PseudoRandomNumberGenerator

// 선형 합동 생성기 LCG - PRNG 의 종류
// Linear Congruential Generator 

static long int seed = 100001;

double LNG()
{
	seed = (125 * seed + 5) % 2796203;
	return seed / (double)2796203;
}

int main(void)
{
	std::cout << LNG() << std::endl;
	std::cout << LNG() << std::endl;
	std::cout << LNG() << std::endl;
}
static UINT32 next = 1;

int __cdecl rand(void)
{
    next = next * 1103515245 + 12345;
    return (UINT32)(next>>16) & RAND_MAX;
}

void __cdecl srand(unsigned int seed)
{
    next = seed;
}

Untitled