- srand: 난수를 발생시킬 초깃값인 시드(seed)를 설정합니다. 보통 현재 시간값을 사용합니다.
srand(time(NULL));
이 코드가 왜 필요한지 모르겠어요...
rand 함수로 그냥 난수 발생시키면 되는거 아닌가요..?
난수 발생에 초깃값이 필요한건가요..?
난수 발생 기법은 '알고리즘' 과정에서 학습하게 됩니다.
여기서는 구현된 알고리즘을 사용하는 방법만 설명하기 때문에 설명이 간단했습니다.
srand()와 rand()는 난수 발생 알고리즘을 이해하면 당연하지만, 모르면 어려울 수 있습니다.
완벽한 난수 발생은 어렵습니다. 대부분의 경우에는 일정한 편향성이 발생합니다. 주사위 1~6까지 발생시킨다면 10만 번을 실행하면 균등하게 주사위가 나와야 하지만 1이 더 많이 나온다거나 하는 편향이 발생합니다. 그래서 가능하면 '균등하게' 난수가 발생하는 알고리즘이 많이 있고, 표준적인 방법은 대부분의 프로그래밍 언어에서 기본 함수로 제공합니다.
정확하게는 완벽한 난수는 어려워서 유사 난수 발생 알고리즘입니다. 유사 난수, 완벽하지는 않지만 대충 비슷하게 난수 같아 보여! 라는 뜻입니다.
난수 발생을 위해 매우 긴 수열을 이용합니다. rand()만 호출하면 그 수열의 첫 번째 값부터 출력되기 때문에 매번 같은 값이 나옵니다. 다만, 임의의 위치에서 수열을 시작하게 하려면? 그럴 때 시간값을 초깃값으로 사용합니다. 난수 발생에서는 이를 시드 설정이라고 하는데, seed는 씨앗값이라는 뜻으로 사용합니다.
미 국립표준원 '진짜 난수' 생성…"정보보안 획기적 진전", 2018.4.12
양자역학 원리 이용…기존 '사이비 난수'와 근본적 차이
네이처에 논문 발표…고도 보안 필요시 실제 사용 추진
무작위로 이어지는 수열인 '난수(亂數·random number)는 정보보안 기술의 근본 핵심 요소 중 하나다. 오늘 하루도 전세계에 깔린 컴퓨터에서 수천억번의 난수 생성이 이뤄지고 있다.
그러나 지금까지 세상의 모든 컴퓨터가 만들어 내는 난수는 '사이비(似以非) 난수'(pseudo-random number)였다. '진짜 난수'를 생성할 방법이 없었기 때문이다.
그러나 이번에 미국 국립표준기술원(NIST) 연구진이 양자역학적 원리를 기반으로 완벽하게 무작위인 '진짜 난수'를 생성하는 데 성공해 12일자로 발간된 국제 학술지 '네이처'(Nature)에 발표했다.
◇ 고전역학적 시스템으로는 진짜 난수 생성 불가능
컴퓨터 프로그램 대신 사람의 행동이나 물리적 시스템을 이용할 수도 있으나, 이 방법으로도 '진짜 난수'를 쉽게 만들 수는 없다.
얼핏 생각하면 동전을 던져서 앞이냐 뒤냐를 보면 완벽하게 무작위일 것 같지만, 실제로는 그렇지 않다.
물리학적 계산과 측정을 통해 앞면이 나올지 뒷면이 나올지 예측하는 것이 가능하다는 것이다. 동전의 위치·속도·회전 등 움직임, 공기의 밀도와 바람과 습도, 동전이 떨어지는 바닥의 재질과 모양 등 영향을 미치는 요인들을 완벽하게 파악하고 있다면 가능한 얘기다.
양자역학적 시스템이 아닌 고전적 시스템에서는 늘 이런 문제가 생긴다.
완벽한 난수는 박사님들이 하는 고차원적인 문제이고, 컴퓨터 공학에서 전 세계에 수많은 박사들이 모여서도 2018년에 완벽한 난수는 양자역학으로 가능하다고 하는 것 같습니다.
일반적인 컴퓨터 세상에서는 여전히 유사 난수를 사용할 겁니다. 가장 효율적이고, 구현하기 쉽고, 아주 적은 컴퓨팅 파워를 사용하니까요. 그 정도면 게임 속 뽑기나 주사위 굴리기 구현에는 문제가 없으니까요.
https://namu.wiki/w/%EB%82%9C%EC%88%98%EC%83%9D%EC%84%B1#s-3
알고리즘 책을 보면 난수 생성이 나오고 중앙제곱법, 선형합동법을 배웁니다.
메르센 트위스터는 좀 더 구현이 어렵고, C++11에는 있다고 하지만, 다른 언어에서는 기본 함수로 제공되지 않는 경우가 대부분입니다. 외부 라이브러리는 대부분의 언어에서 찾아볼 수 있을 겁니다.