난수 Random number 는 존재하는가?

 

난수

 

난수(random number)는 무작위로 선택된 숫자를 말한다.

원하는 만큼의 난수를 얻는 것은 사회조사나 심리학 실험 설계에서 매우 중요하고, 빈번한 일이다.

예를 들어, 한 학급의 평균 키를 추정하기 위해 10명을 샘플로 추출하여 키를 잰다고 가정하자.

1번부터 10번 학생을 추출하여 잰 키를 평균이라고 하면 분명히 문제가 생길 것이다. 만약 키순서로 번호를 정했다면, 추정치는 실제보다 훨씬 작아질 테니까.

어떻게 학생을 선발해야 이런 문제가 없을까? 한 반의 학생이 50명이라고 가정하고, 번호가 5의 배수인 학생들을 선발하면 어떨까? (5,10,15,20….)

처음보다는 낫긴 하지만, 안전하다고 확답할 수는 없다. 만약 학급의 책상이 다섯 줄이고, 키 순서로 앉힌 뒤(가로로), 분단별로(세로로) 번호를 매긴다면, 5의 배수인 학생들은 가장 키가 큰 맨 뒷 줄 학생들로만 구성될 수도 있다.

그런 종류의 규칙성이 만약 집단 내에 존재한다면, 일정한 규칙에 따라 추출한 샘플이 편향된 특성을 가질 수도 있는 것이다.(우리는 집단 내에 존재하는 규칙들을 다 알 수는 없다.)

비슷한 문제는 여러 곳에서 발생할 수 있다. 응모자 가운데 10명을 ‘무작위로 선정하여’ 경품을 준다고 하자. 무작위라는 것을 어떻게 담보할 것인가?

응모엽서가 1000장쯤 되면, 박스에 넣고휘휘 젓다가 마음대로 10장을 골라낼 수도 있을 것이다.

만약 100만 명의 응모자가 있고, 그 중 1000장을 뽑아야 하면 어떻게 할 것인가? 그걸 일일이 직접 골라낸다면 굉장히 비효율적인 방법이 될 것이다.

게다가, 최근에 응모한 사람들의 엽서가 위쪽에 놓여질 것이므로, 공평한 ‘무작위’라고 볼 수 없다.

실험을 할 때도 이런 상황은 자주 발생한다. 기억력을 테스트하기 위해 단어들을 추출할 때, 사람마다 배경지식에 따라 단어에 대한 기억이 달라질 것이므로, 사전에서 무작위로 추출해야 한다.

어떻게 해야 할까 – 무작위로 사전을 적당히 펼쳐서 맨 왼쪽 처음에 나온 단어를 택하는 방식이면 괜찮을까?

실제로 종종 쓰이기도 하는 방법이지만, 진정한 무작위라고 하기는 어렵다.

결국 사전을 펼치는 부분은 사람의 습성에 따라 편중되기 마련이며, 페이지의 맨 첫 단어들에게만 기회가 돌아가기 때문이다.

 

무작위 수를 추출하는 전통적인 방식은 카드를 활용하는 것이다.

카드에 1~50번까지 숫자를 적고, 보이지 않게 섞은 뒤 10장을 뽑으면, 무작위라고 할 수 있을 것이다.

이는 최근까지도 심리학 실험을 위해 (순서를 정한다거나) 사용되는 방법이고, 월드컵에서 조 추첨을 하거나 로또 번호를 추첨하는 것과도 유사한 방법이다.

주사위를 이용하는 것도 방법인데, 이는 난수를 발생시키기 위해 전통적으로 도박장에서 많이 써오던 방법이다.

(참고로 말하자면, 난수를 추출하는 데는 크게 두 가지 타입이 있다. 첫번째는 random으로써, 이는 주사위와 비슷하다. 1~6까지의 숫자가 무작위로, 중복해서 나올 수 있다.

두 번째는 Shuffle로써, 이는 카드와 유사하다. 무작위로 카드가 선정되지만, 똑 같은 카드가 두 번 나올 수는 없다.

많은 경우에, 심리학 실험을 위해서는 Shuffle 방식을 사용하는 경우가 더 합리적이다.)

무작위 수를 보다 체계적으로 발생시키기 위해서 수학자들은 난수표(random number table)이란 것을 만들어 사용해 왔다.

난수표는 0~9까지의 숫자가 균등하게 출현하도록 임의의 숫자를 잔뜩 배열해 놓은 표이다.

이 난수표의 아무 숫자나 골라서 상하좌우 중 한방향으로 진행해 나가면 예측 불가능한(상대방에 이 난수표를 가지고 있지 않는 한) 난수를 얻을 수 있다.

여기서 ‘예측 불가능한’ 이라는 속성이 중요한데, 이것이 바로 난수를 난수이게 하는 핵심적인 특징인 것이다

(만약 다음에 나올 숫자를 예측 가능하다면 규칙성이 있다는 뜻이고, 그것은 더 이상 난수가 아니다).

 

현대 사회에서 난수는 더욱 중요한 의미를 갖는데, 왜냐하면 오늘날 많은 암호가 난수를 기반으로 작동하기 때문이다.

예를 들어 온라인 뱅킹을 위한 보안카드는 일종의 난수표다.

보안 카드 위의 숫자들은 아무런 규칙성이 없어서,카드를 발행한 은행과, 카드 소유자 외에는 절대로 숫자를 예측할 수 없다(아무런 규칙이 없으므로).

만약 누군가 보안카드의 숫자를 생성하는 규칙을 안다면, 그는 마음대로 남의 돈을 갈취할 수 있을 것이다.

OTP(보안카드를 대신하는 1회용 보안키 생성장치)도 보안카드와 유사한데, 다른 점은 전자회로를 이용하여 매번 암호를 발생시킨다는 것이다.

이 암호는 어떻게 생성될까? 사용자가 OTP에 뜬 번호를 웹사이트에 입력하면, 은행에서는 이 번호가 정당한 소유자가 입력한 것인지 아닌지 확인한다.

하지만 OTP와 은행 간에는 아무런 정보를 주고 받지 않는다.

그렇다면 무슨 근거로 이것이 OTP에서 생성된 번호라는 걸 알까? OTP안에는 일련의 암호리스트가 있어서, 은행에서는 그 중의 하나가 입력되면 허가하는 것일까?

이는 매우 위험한 방식이다. 만약 누군가 그 규칙을 알거나, 한번이라도 타인의 OTP 암호를 훔쳐보면 계속 사용할 수 있을 것이기 때문이다.

다행히 그렇게 단순하진 않다.

OTP의 번호는 계속 다른 번호가 생성되며, 훔쳐본 번호를 입력한다 해도 인터넷 뱅킹이 허용되지 않는다.

이는 OTP가 암호를 생성시킨 시각에, 사용자의 고유번호(이게 난수다!)를 조합하여 계속 새로운 암호를 생성하기 때문이다.

그러므로 그 시각에 생성 가능한 암호는 한정되어 있으며, 대체로 OTP암호를 45초 안에 입력하지 않으면 무효가 된다.

 

현대에는 어떻게 난수를 생성시킬까?

지금은 대부분 컴퓨터 프로그램을 이용하여 난수를 생성한다. 대부분의 프로그래밍 언어는 난수를 발생시키는 함수를 가지고 있다.

rand, random과 같은 함수들은 난수를 생성시키는데, 이들은 그 순간의 컴퓨터 CPU시각과, 컴퓨터 하드웨어의 고유번호(LAN카드의 맥어드레스 등)을 이용하여 난수를 발생시킨다.

그런데 가끔 어떤 프로그램으로 난수를 생성키시면, 일련의 숫자들이 생성되지만 다음번에 실행시켜도 똑같은 숫자들이 나오기도 한다.

이는 난수씨앗(random seed)가 같기 때문에 생기는 문제다. 만약 난수 생성 함수가, 호출된 뒤 걸리는 시간(이게 최초의 난수 씨앗이 된다)에 일정한 공식(5번 제곱하고 30으로 나눈다 – )으로 난수를만든다면,그리고 생성된 첫 번째 난수가 다시 두 번째 난수의 난수씨앗이 된다면, 프로그램을 실행할 때마다 계속 반복되어 난수가 생기게 되는 것이다.

씨앗이 같고 생성규칙이 같다면 같은 난수가 나오는 것이고, 이는 더 이상 난수라고 할 수 없다.

그렇기 때문에 씨앗을 강제로 바꿔주는(현재의 시각으로 한다거나) 하는 작업을 필요로 하는 경우도 있다.

그렇지만 대부분의 경우 생성된 난수를 다음 번 난수 발생의 씨앗으로 사용하기 때문에, 만약 난수 생성 규칙을 안다면 충분히 예측할 수 있게 된다.

 

‘그렇다면 컴퓨터로 생성하는 것은 난수가 아니지 않은가’라고 묻는다면 – 정답이다.

본질적으로 컴퓨터가 무작위수를 생성한다는 것은 불가능하다. 무작위란 ‘마음 내키는 대로, 이유 없이’ 고르는 것인데, 정해진 규칙대로만 수행하는 컴퓨터가 난수를 생성한다는 것은

애초에 불가능한 것이다.

하지만 대부분의 사람들은 난수 규칙을 모르고(안다 해도 굉장히 복잡하고), 나름 씨앗을 바꿔가기 때문에 일상적으로 난수를 생성하는데 컴퓨터를 활용하는 것은 문제가 되지 않는다.

그렇다면 제대로 난수를 만들려면 어떻게 해야 할까? 당신은 만약 ‘333333’…을 난수라고 생각하지 않을 것이다.

이는 간단한 규칙으로 예상되기 때문이다. ‘3 이 계속 이어진다’ 거나 더 간단히 표현하자면 ‘1/3’이 그것이다(0.3333…에서 0과 소숫점만 빼면 된다). ‘28571428714…’는 어떨까?

조금 들여다보면 285714 가 반복된다는 것, 그리고 그 배후에는 2/7이라는 규칙이 있다. 하지만 ‘1074113856068743286788995703 545…’은 어떤가? 규칙이 있어 보이는가?이 숫자는 난수일까?

규칙을 찾긴 어렵겠지만 사실 이 숫자는 10000/963에서 나온 것이다.

그렇다면 어떤 이상한 수열을 보더라도 우리는 난수라고 확신할 수 없게 된다. 우리가 모르는 것 뿐이지, 이 수열을 더 쉽게 요약하는 간단한 공식이 있는지 없는지 어떻게 아는가?

존재할지도 모르는 모든 공식을 조사한다는 것은 불가능하고, 그렇다면 우리는 난수가 진정한 난수인지 판단하는 것은 불가능하다는 뜻일까?

애석하게도 그렇다. 우리는 주어진 수열이 난수인지 아닌지 확신할 수 있는 방법을 알지 못한다. 그렇다고 애석해 할 필요는 없다.

반대로, 규칙은 알지만 전혀 예측할 수 없는 난수가 자연계에는 얼마든지 존재한다. 간단한 예를 들면 원주율이 그렇다. 원주율은 우리가 얼마든지 상세하게 계산할 수 있지만,

반복되지도 않고 예측할 수도 없다. 원하는 만큼 계속 정교하게 계산해나갈 수는 있지만 다음에 어떤 수가 나올지는 누구도 예상하지 못한다. 이는 난수인가?

혹은 원주율을 계산하는 방법이 있으니 난수가 아닌가? – 사실 원주율 뿐 아니라 모든 무리수가 그러하다. 2의 제곱근은 무한히 이어지며 예측 불가능한 수열을 만든다.

리서치나 심리실험을 위해 난수를 빈번히 발생시키고 있지만(예를 들어 Lexicon테스트에서 자극의 순서는 Shuffle함수를 써서 무작위로 제시된다.)

사실 난수는 매우 불가해한 개념이라고 볼 수 있다. 무작위로 뒤섞인 자극 제시 시나리오를 볼 때, 약간의 경외심을 갖는 것은 어떨까.

 

 

브레인앤리서치

류기정 팀장

난수 Random number 는 존재하는가?

 

난수

 

난수(random number)는 무작위로 선택된 숫자를 말한다.

원하는 만큼의 난수를 얻는 것은 사회조사나 심리학 실험 설계에서 매우 중요하고, 빈번한 일이다.

예를 들어, 한 학급의 평균 키를 추정하기 위해 10명을 샘플로 추출하여 키를 잰다고 가정하자.

1번부터 10번 학생을 추출하여 잰 키를 평균이라고 하면 분명히 문제가 생길 것이다. 만약 키순서로 번호를 정했다면, 추정치는 실제보다 훨씬 작아질 테니까.

어떻게 학생을 선발해야 이런 문제가 없을까? 한 반의 학생이 50명이라고 가정하고, 번호가 5의 배수인 학생들을 선발하면 어떨까? (5,10,15,20….)

처음보다는 낫긴 하지만, 안전하다고 확답할 수는 없다. 만약 학급의 책상이 다섯 줄이고, 키 순서로 앉힌 뒤(가로로), 분단별로(세로로) 번호를 매긴다면, 5의 배수인 학생들은 가장 키가 큰 맨 뒷 줄 학생들로만 구성될 수도 있다.

그런 종류의 규칙성이 만약 집단 내에 존재한다면, 일정한 규칙에 따라 추출한 샘플이 편향된 특성을 가질 수도 있는 것이다.(우리는 집단 내에 존재하는 규칙들을 다 알 수는 없다.)

비슷한 문제는 여러 곳에서 발생할 수 있다. 응모자 가운데 10명을 ‘무작위로 선정하여’ 경품을 준다고 하자. 무작위라는 것을 어떻게 담보할 것인가?

응모엽서가 1000장쯤 되면, 박스에 넣고휘휘 젓다가 마음대로 10장을 골라낼 수도 있을 것이다.

만약 100만 명의 응모자가 있고, 그 중 1000장을 뽑아야 하면 어떻게 할 것인가? 그걸 일일이 직접 골라낸다면 굉장히 비효율적인 방법이 될 것이다.

게다가, 최근에 응모한 사람들의 엽서가 위쪽에 놓여질 것이므로, 공평한 ‘무작위’라고 볼 수 없다.

실험을 할 때도 이런 상황은 자주 발생한다. 기억력을 테스트하기 위해 단어들을 추출할 때, 사람마다 배경지식에 따라 단어에 대한 기억이 달라질 것이므로, 사전에서 무작위로 추출해야 한다.

어떻게 해야 할까 – 무작위로 사전을 적당히 펼쳐서 맨 왼쪽 처음에 나온 단어를 택하는 방식이면 괜찮을까?

실제로 종종 쓰이기도 하는 방법이지만, 진정한 무작위라고 하기는 어렵다.

결국 사전을 펼치는 부분은 사람의 습성에 따라 편중되기 마련이며, 페이지의 맨 첫 단어들에게만 기회가 돌아가기 때문이다.

 

무작위 수를 추출하는 전통적인 방식은 카드를 활용하는 것이다.

카드에 1~50번까지 숫자를 적고, 보이지 않게 섞은 뒤 10장을 뽑으면, 무작위라고 할 수 있을 것이다.

이는 최근까지도 심리학 실험을 위해 (순서를 정한다거나) 사용되는 방법이고, 월드컵에서 조 추첨을 하거나 로또 번호를 추첨하는 것과도 유사한 방법이다.

주사위를 이용하는 것도 방법인데, 이는 난수를 발생시키기 위해 전통적으로 도박장에서 많이 써오던 방법이다.

(참고로 말하자면, 난수를 추출하는 데는 크게 두 가지 타입이 있다. 첫번째는 random으로써, 이는 주사위와 비슷하다. 1~6까지의 숫자가 무작위로, 중복해서 나올 수 있다.

두 번째는 Shuffle로써, 이는 카드와 유사하다. 무작위로 카드가 선정되지만, 똑 같은 카드가 두 번 나올 수는 없다.

많은 경우에, 심리학 실험을 위해서는 Shuffle 방식을 사용하는 경우가 더 합리적이다.)

무작위 수를 보다 체계적으로 발생시키기 위해서 수학자들은 난수표(random number table)이란 것을 만들어 사용해 왔다.

난수표는 0~9까지의 숫자가 균등하게 출현하도록 임의의 숫자를 잔뜩 배열해 놓은 표이다.

이 난수표의 아무 숫자나 골라서 상하좌우 중 한방향으로 진행해 나가면 예측 불가능한(상대방에 이 난수표를 가지고 있지 않는 한) 난수를 얻을 수 있다.

여기서 ‘예측 불가능한’ 이라는 속성이 중요한데, 이것이 바로 난수를 난수이게 하는 핵심적인 특징인 것이다

(만약 다음에 나올 숫자를 예측 가능하다면 규칙성이 있다는 뜻이고, 그것은 더 이상 난수가 아니다).

 

현대 사회에서 난수는 더욱 중요한 의미를 갖는데, 왜냐하면 오늘날 많은 암호가 난수를 기반으로 작동하기 때문이다.

예를 들어 온라인 뱅킹을 위한 보안카드는 일종의 난수표다.

보안 카드 위의 숫자들은 아무런 규칙성이 없어서,카드를 발행한 은행과, 카드 소유자 외에는 절대로 숫자를 예측할 수 없다(아무런 규칙이 없으므로).

만약 누군가 보안카드의 숫자를 생성하는 규칙을 안다면, 그는 마음대로 남의 돈을 갈취할 수 있을 것이다.

OTP(보안카드를 대신하는 1회용 보안키 생성장치)도 보안카드와 유사한데, 다른 점은 전자회로를 이용하여 매번 암호를 발생시킨다는 것이다.

이 암호는 어떻게 생성될까? 사용자가 OTP에 뜬 번호를 웹사이트에 입력하면, 은행에서는 이 번호가 정당한 소유자가 입력한 것인지 아닌지 확인한다.

하지만 OTP와 은행 간에는 아무런 정보를 주고 받지 않는다.

그렇다면 무슨 근거로 이것이 OTP에서 생성된 번호라는 걸 알까? OTP안에는 일련의 암호리스트가 있어서, 은행에서는 그 중의 하나가 입력되면 허가하는 것일까?

이는 매우 위험한 방식이다. 만약 누군가 그 규칙을 알거나, 한번이라도 타인의 OTP 암호를 훔쳐보면 계속 사용할 수 있을 것이기 때문이다.

다행히 그렇게 단순하진 않다.

OTP의 번호는 계속 다른 번호가 생성되며, 훔쳐본 번호를 입력한다 해도 인터넷 뱅킹이 허용되지 않는다.

이는 OTP가 암호를 생성시킨 시각에, 사용자의 고유번호(이게 난수다!)를 조합하여 계속 새로운 암호를 생성하기 때문이다.

그러므로 그 시각에 생성 가능한 암호는 한정되어 있으며, 대체로 OTP암호를 45초 안에 입력하지 않으면 무효가 된다.

 

현대에는 어떻게 난수를 생성시킬까?

지금은 대부분 컴퓨터 프로그램을 이용하여 난수를 생성한다. 대부분의 프로그래밍 언어는 난수를 발생시키는 함수를 가지고 있다.

rand, random과 같은 함수들은 난수를 생성시키는데, 이들은 그 순간의 컴퓨터 CPU시각과, 컴퓨터 하드웨어의 고유번호(LAN카드의 맥어드레스 등)을 이용하여 난수를 발생시킨다.

그런데 가끔 어떤 프로그램으로 난수를 생성키시면, 일련의 숫자들이 생성되지만 다음번에 실행시켜도 똑같은 숫자들이 나오기도 한다.

이는 난수씨앗(random seed)가 같기 때문에 생기는 문제다. 만약 난수 생성 함수가, 호출된 뒤 걸리는 시간(이게 최초의 난수 씨앗이 된다)에 일정한 공식(5번 제곱하고 30으로 나눈다 – )으로 난수를만든다면,그리고 생성된 첫 번째 난수가 다시 두 번째 난수의 난수씨앗이 된다면, 프로그램을 실행할 때마다 계속 반복되어 난수가 생기게 되는 것이다.

씨앗이 같고 생성규칙이 같다면 같은 난수가 나오는 것이고, 이는 더 이상 난수라고 할 수 없다.

그렇기 때문에 씨앗을 강제로 바꿔주는(현재의 시각으로 한다거나) 하는 작업을 필요로 하는 경우도 있다.

그렇지만 대부분의 경우 생성된 난수를 다음 번 난수 발생의 씨앗으로 사용하기 때문에, 만약 난수 생성 규칙을 안다면 충분히 예측할 수 있게 된다.

 

‘그렇다면 컴퓨터로 생성하는 것은 난수가 아니지 않은가’라고 묻는다면 – 정답이다.

본질적으로 컴퓨터가 무작위수를 생성한다는 것은 불가능하다. 무작위란 ‘마음 내키는 대로, 이유 없이’ 고르는 것인데, 정해진 규칙대로만 수행하는 컴퓨터가 난수를 생성한다는 것은

애초에 불가능한 것이다.

하지만 대부분의 사람들은 난수 규칙을 모르고(안다 해도 굉장히 복잡하고), 나름 씨앗을 바꿔가기 때문에 일상적으로 난수를 생성하는데 컴퓨터를 활용하는 것은 문제가 되지 않는다.

그렇다면 제대로 난수를 만들려면 어떻게 해야 할까? 당신은 만약 ‘333333’…을 난수라고 생각하지 않을 것이다.

이는 간단한 규칙으로 예상되기 때문이다. ‘3 이 계속 이어진다’ 거나 더 간단히 표현하자면 ‘1/3’이 그것이다(0.3333…에서 0과 소숫점만 빼면 된다). ‘28571428714…’는 어떨까?

조금 들여다보면 285714 가 반복된다는 것, 그리고 그 배후에는 2/7이라는 규칙이 있다. 하지만 ‘1074113856068743286788995703 545…’은 어떤가? 규칙이 있어 보이는가?이 숫자는 난수일까?

규칙을 찾긴 어렵겠지만 사실 이 숫자는 10000/963에서 나온 것이다.

그렇다면 어떤 이상한 수열을 보더라도 우리는 난수라고 확신할 수 없게 된다. 우리가 모르는 것 뿐이지, 이 수열을 더 쉽게 요약하는 간단한 공식이 있는지 없는지 어떻게 아는가?

존재할지도 모르는 모든 공식을 조사한다는 것은 불가능하고, 그렇다면 우리는 난수가 진정한 난수인지 판단하는 것은 불가능하다는 뜻일까?

애석하게도 그렇다. 우리는 주어진 수열이 난수인지 아닌지 확신할 수 있는 방법을 알지 못한다. 그렇다고 애석해 할 필요는 없다.

반대로, 규칙은 알지만 전혀 예측할 수 없는 난수가 자연계에는 얼마든지 존재한다. 간단한 예를 들면 원주율이 그렇다. 원주율은 우리가 얼마든지 상세하게 계산할 수 있지만,

반복되지도 않고 예측할 수도 없다. 원하는 만큼 계속 정교하게 계산해나갈 수는 있지만 다음에 어떤 수가 나올지는 누구도 예상하지 못한다. 이는 난수인가?

혹은 원주율을 계산하는 방법이 있으니 난수가 아닌가? – 사실 원주율 뿐 아니라 모든 무리수가 그러하다. 2의 제곱근은 무한히 이어지며 예측 불가능한 수열을 만든다.

리서치나 심리실험을 위해 난수를 빈번히 발생시키고 있지만(예를 들어 Lexicon테스트에서 자극의 순서는 Shuffle함수를 써서 무작위로 제시된다.)

사실 난수는 매우 불가해한 개념이라고 볼 수 있다. 무작위로 뒤섞인 자극 제시 시나리오를 볼 때, 약간의 경외심을 갖는 것은 어떨까.

 

 

브레인앤리서치

류기정 팀장