문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 난수생성 (문단 편집) == 상세 == 역설적이게도, 컴퓨터는 싱글코어 기준으로는 '''난수를 만들 수 없다.''' 1대의 CPU로는 무의식적인 선택, 또는 우연에 의하는 선택을 할 수 없기에 기본적으로 정해진 입력에 따라 정해진 값을 낼 뿐이다. 전문용어로는 '결정적 유한 오토마타(Deterministic Finite Automata)'. 흔히 보는 랜덤은 정말로 임의의 값이 아니고 특정한 방법으로 계산하거나 몇 밀리초(ms) 단위로 시시각각 변하는 값을 초기값으로 잡고[* 정말 극단적인 예를 들면, 0.001초에 누르면 난수는 1, 0.002초에 누르면 난수는 2.... 이런식으로 시간을 난수에 대입시킨것이다. 물론 실제 계산은 더 복잡하다.] 여러 계산 과정을 거쳐 사람이 볼 때에 마치 임의의 값인 것__처럼 보이게__ 하는 것이다. '의사난수(擬似亂數/Pseudo Random)'라고 한다. 흔히 난수표를 쓰는데 난수표가 정해진 이상 결국은 같은 순서로 같은 숫자가 나온다. [[봄버맨(패미컴)|패미컴 버전 봄버맨]]을 시작할 때 1탄의 벽돌들이 대체로 일정하게 배열되는 점을 떠올리면 어느 정도 이해가 갈 것이다. 비슷한 예로 [[MS-DOS]] 버전 [[테트리스]]에서 나오는 블럭의 순서가 모두 똑같으며, [[크레이지 아케이드/테트리스|크레이지 아케이드 테트리스]]도 난수가 제대로 생성되지 않았던 탓에 테트리스 계의 [[똥겜]]으로 전락할 뻔했다. 난수표를 여러 개 만들어 놓고 매번 다른 난수표를 읽히면 이 문제를 해결할 수 있다. 이 난수표를 선택하는 것을 '[[시드]]'라고 한다. 그런데 시드값이 똑같으면 선택되는 난수표도 똑같기 때문에 시드값도 난수여야 한다. 즉, [[순환 논법|'''난수를 만들려면 난수가 필요한''' 문제]]가 발생하는 것. 해결책은 난수를 만드는 것이 아니라 '''입력'''으로 받는 것이다. 시드 입력으로 난수표 고르기는 사용자가 그 많은 난수를 일일이 입력하지 않아도 되는 편의를 제공한다. 쉽게 사용할 수 있는 것은 현재 시각으로, 컴퓨터는 밀리초 단위까지 사용하므로 일부러 똑같은 시드를 만드는 건 불가능에 가깝다. 하지만 엄밀히 따지면 현재 시각은 ~~타임머신을 쓰지 않는 한~~ 단조 증가라는 패턴이 있어서 완전한 난수는 되지 않는다. Windows에선 시간 이외에도 컴퓨터가 켜져있는 시간 (ns단위), CPU 메모리의 클럭/온도, 프로세스 ID나 쓰레드 ID (매 부팅마다 방 온도나 발전소 전기 품질, 컴퓨터 내부 부품 등에 따라 어느 정도씩 전부 달라질 수 있는 것 들이다.) 등도 사용한다.[[https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptgenrandom|#]] 마지막으로 생성한 난수값을 별도로 저장해 뒀다가 그것을 시드로 하기도 하고 사용자의 입력 행동을[* 키보드의 키를 누른 시간 간격을 샘플링 한 것, 사용자의 입력 자체, [[VeraCrypt]]에서도 쓰인 마우스 움직임 등.] 시드값으로 삼기도 한다. 여러 개선책이 있지만 근본적으로 시드를 기반으로 한 랜덤함수는 완전한 무작위라고 보기가 힘들다. 특정 패턴의 경우 영원히 안 나올 수도 있고[* 예를 들면 [[아랑전설 3]]의 숨겨진 [[초필살기]]인 잠재능력의 발동 방법은 랜덤 발동과 커맨드 입력 발동 두 가지가 있는데, 랜덤으로 발동되는 확률인 1/1024를 만족하는 난수가 안 나와서 랜덤으로는 절대로 발동이 안 된다.], 시드값 생성에 요구하는게 너무 적다면 정밀도가 낮을 경우는 [[전원 패턴]]이나 [[에픽세븐/사건 사고#s-2.9.|타임테이블 논란]][* 정밀도가 낮은 시드값을 써서 문제되었는데, 당시 증상 때문에 시간만 쓴 것으로 추정되었다.] 같은 극단적인 일도 생길수 있다. 암호화에도 문제가 되는데, 시드 기반 난수로 암호화 키를 생성하는 경우 키 값의 일부를 알고 있다면 나머지 키 값도 유추하는게 가능해질 수 있다. 일반적인 게임에서는 어느정도의 무작위성으로도 충분하지만, 현찰이 오가는 도박 사이트처럼 정말 랜덤이 필요한 경우 시드 기반의 의사랜덤은 쓰지 않는다. 하지만 여러대의 CPU를 사용하는 멀티코어 컴퓨터라면 진짜 난수도 생성 가능하다. 의사난수와 달리 각 CPU의 작동속도를 기준으로 작동하며, 각 CPU가 언제 메모리에 접근해 읽고 쓰는지를 미리 예측하는것은 불가능하기 때문이다. 1997년 개발된 MT19937(후술할 메르센 트위스터의 일종이다.)를 예로 들자면, 이 알고리즘으로 생성된 난수는 623개까지 연속된 난수를 뽑아볼 때 각 난수의 처음 32비트는 동일분포가 보장된다(32-bit accuracy). 다만 623에서 단 하나 늘어난 624개의 연속된 난수만 어떻게 확보한다면 시드값을 털어버릴 수 있는 치명적인 문제가 있어서 보안이 필요한 곳에서 쓰려면 좀 꼼수가 필요하다.[* 의사난수인 이상 시드값을 알면 모든 결과를 미리 계산할 수 있다.] 결과값을 공개하기 전에 해시 함수로 원본을 알아내지 못하게 한다든가 난수를 한 번에 생성한 후 순서를 뒤섞어서 공개한다든가. 이런 좋은 MT19937이란 알고리즘은 [[https://docs.python.org/3/library/random.html|Python]], [[https://www.php.net/manual/en/function.rand.php|PHP]] 등 대부분의 프로그래밍 언어에서도 이미 기본으로 쓰고 있는 알고리즘이고, C/C++에서 쓰고 있는 rand() 함수가 언어 역사만큼 오래된 안 좋은 랜덤 알고리즘을 쓰고 있을 뿐이다. 현실을 재현하는 것이 아닌 실용 프로그래밍, 특히 단방향 암호화를 포함한 보안 계열을 제외한 실제 응용 프로그램 설계에선 완전 난수보다 의사 난수가 더 많은 분야에 유용하다. 의사난수의 '같은 시드는 같은 결과를 부른다'를 장점으로 활용해, 네트워크 게임의 플레이어 간 동기화에서부터 리플레이 모드 구현까지[* 스타크래프트의 리플레이 모드를 생각해 보면 된다. 게임의 시드만 저장하면 AI의 모든 판단을 다 저장할 필요가 없어진다.] 오만 곳에 써먹을 수 있다. 마찬가지로 [[도박]]에서 원하는 결과가 나오게 악용할 수 있다. 이런 걸 [[난수조절]]이라고 한다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기