만져보는 임베디드 시스템/아두이노 소프트웨어

아두이노 소프트웨어-xiii. 함수 -난수 생성 함수

hanjinee 2020. 12. 31. 00:43

안녕하세요 제타지니입니다. 오늘은 난수 생성 함수에 대해서 다루어 보려고 합니다.

 

난수생성함수에 대한 이야기는 생각보다 길어질 것 같아서 이번 포스트에서 하겠습니다. 

컴퓨터는 난수 생성에 굉장히 취약합니다. 왜냐하면 컴퓨터란 녀석은 '정해진 명령'을 따라 수행하는 녀석이기 때문에 '예외'에 취약한 성격을 보이기 때문이지요.(컴퓨터의 특성 Deterministic, Deterministic Algorithm을 사용하기 때문)

그래서 컴퓨터로 진짜-난수(True-random number)를 만드는 것은 사실상 불가능합니다. 하지만 가짜-난수(pseudo-random number)를 만드는 것은 가능하지요! 이 가짜-난수를 진짜-난수처럼 보이게 하면 됩니다! 

가짜-난수는 다음과 같은 특성을 지니지요. 

1. 일련의 가짜-난수들은 계속해서 반복되면 아니된다.

2. 가짜-난수들은 잘 퍼져 있어야 한다. 

이 가짜-난수들을 만들기 위해서는 '예외에 취약한 성격'을 탈피해야 하는데요, 여기에는 '시작점'이라는 녀석이 필요합니다. '시작점'을 주지 않는다면 컴퓨터는 '정해진 명령과 절차에 따라 수행하기 때문'에 같은 결과를 낼 수 밖에 없지요. 그리고 이 시작점을 컴퓨터에서는 '씨앗(Seed)'라고 합니다. 

씨앗(Seed)이라고 하는 놈은 시작점임과 동시에 만약 사용자분이 같은 씨앗(Seed)을 함수에 넣는다면 같은 일련의 숫자, 동일한 순서의 값을 얻도록 보증해주는 역할을 하기도 합니다.  

이 씨앗(Seed)를 이용해서 난수를 생성하는 함수는 randomSeed입니다.

randomSeed함수

void randomSeed(unsigned int seed);

seed: 의사 난수의 시작 위치 결정을 위한 값. 

씨앗(Seed) 외부회로가 연결되지 않은 아날로그 핀으로부터 무작위 값을 입력받아 사용하는 것 가장 간단한 방법입니다. 예를 들어 Analog pin 0 (A0)에 외부회로가 연결되어 있지 않은 경우 analogRead(A0)의 반환값을 씨앗(Seed)로 사용할 수 있습니다. 

 

씨앗을 이용하지 않고 난수를 생성하는 방법도 있습니다. 

random함수

long random(long max); //최대값-1이 생성될 난수의 최대값입니다. min이 설정되지 않으면, 그냥 min값을 0으로 설정되고 난수를 생성합니다. 

long random(long min, long max); //최솟값(min)부터 최대값(min-1)까지의 범위 내에서 난수를 생성합니다. 

728x90