본문 바로가기

개발 이야기/ETC

임의(Arbitrary)값과 무작위(Random)값은 어떻게 다를까?

각각 Arbitrary는 '임의의'라는 Random은 '무작위'라는 사전적인 의미를 지니고 있다. 일상생활에서 두 단어는 보통 구별없이 사용해도 큰 무리가 되지 않는다. 하지만 컴퓨터과학이나 수학 영역에서는 이 두 단어의 미묘한 차이는 결코 작지 않다.

임의(Arbitrary)

Arbitraryany의 의미를 가진다. 대상이 되는 것들 중에서 무엇을 선택해도 아무런 상관이 없다는 뜻이다. 무엇을 선택하더라도 선택에 따른 비용은 동일하다. 예를 들어 1부터 100까지의 숫자 중에서 1개를 선택하는 경우, 그냥 선택하는 행위 자체가 중요하다. 즉, 무엇을 선택해도 상관없으며 실제 선택의 행위로 인한 비용도 동일하다. 보통 여러 가지 경우의 수를 통해서 무언가를 테스트하는 경우 임의 값을 통해서 검증하는 경우이다. 어떤 값이 선택되는 것 자체가 중요하지 않고 검증의 결과가 중요하다.

무작위(Random)

Random은 확률 분포의 의미를 함께 내포한다. 임의의 대상에서 선택에 대한 확률이 예상되고, 이런 확률에 기반하여 결과의 기대값을 가진다. 예를 들어 1부터 100까지의 숫자 중에서 1개를 선택하는 경우, 우리는 각각의 숫자를 선택할 확률을 1/100으로 가정하고 이에 대한 선택의 기대값이 존재한다면 Random하게 숫자를 선택한다고 볼 수 있다.

마무리

그렇다면 실제 프로그래밍을 하면서 arbitraryrandom의 의미를 구분하는 것이 의미가 있을까? 사실 두 단어는 프로그래밍을 하다보면 기능적으로 구분하기 보다는 맥락으로 구분을 하는 경우가 많다.

예를 들어서 Random 함수는 말 그대로 Random의 성격을 가진다. 사실 Random 함수는 실제로 완벽한 난수를 생성하는 것이 불가능하기 때문에 이런 Random 함수는 지정된 범위 중에서 동일학 확률 빈도로 유사 랜덤(Pseudo Random) 값을 선택하게 만든다. 하지만 이런 함수 구현의 의도 자체가 지정된 범위 안에서 각각의 경우의 수를 동일한 확률 빈도로 선택하기 위한 것이기에 그 자체로 Random의 성격을 가진다.

임의의 값을 input으로 하는 유닛 테스트를 작성하는 경우는 대표적으로 arbitrary의 의미를 가진다. 유닛 테스트는 모든 경우의 수의 확률적 분포를 확인하는 것이 목적이 아닌 경우가 대부분이다. 때문에 극단적으로 하나의 유닛 테스트가 N번의 동일한 input 값으로 테스트를 하더라도 기대 결과가 일치한다면 input은 아무 상관이 없다. 선택의 값이 중요한 것이 아니라 해당 값을 통한 처리 과정의 검증이 중요하기 때문이다.