random(max) 또는 random(min, max) 함수는 난수를 생성해 주는 함수이다.
max(값 제외) 값만 설정하면 0 ~ (max-1) 범위 내의 숫자를 무작위로 추출해 내고 min와 max 값을 설정해 주면 min(값 포함) ~ max(값 제외) 범위 내의 숫자를 무작위로 추출해 낸다.
max 값은 제외되므로 만약 0 ~ 10 사이의 랜덤한 값을 얻고자 한다면 max를 11로 설정 해준다.
아래 코드를 아두이노에 업로드하면
void setup() {
Serial.begin(9600);
for (int i = 0; i < 10; i++) {
uint8_t temp = random(0, 10);
Serial.print(temp);
}
}
void loop() {
}
시리얼 모니터에 "4752486881"과 같이 난수가 생성되게 된다. 하지만 아두이노의 리셋 버튼을 클릭해보면 앞에 나왔던 값과 똑같은 값이 출력되게 된다. 이 얘기는 아두이노 내부적인 조건에 따라 난수 생성 시퀀스가 정해져 있다고도 볼 수 있다. 조건이 바뀌지 않으면 생성된 난수의 값이 바뀌지 않는다는 얘기이다. random 함수를 사용하는 이유는 매번 다른 값을 만들어 내기 위함인데 리셋이 되면 앞서 리셋되었던 때의 난수와 같은 값만을 생성하게 되면서 사용할 수가 없게 된다.
아두이노 참조 사이트의 random 함수 예제 아래 주의와 경고 항목을 살펴보자.
https://www.arduino.cc/reference/ko/language/functions/random-numbers/random/
주의와 경고
If it is important for a sequence of values generated by random() to differ, on subsequent executions of a sketch, use randomSeed() to initialize the random number generator with a fairly random input, such as analogRead() on an unconnected pin.
랜덤()에 의해 생성된 값의 시퀀스가 달라지는 것이 중요한 경우, 사용되지 않는 아날로그 핀의 Read() 값을 이용하는 randomSeed() 함수를 사용하여 의사 난수 초기값을 생성시켜 random() 함수를 실행시키세요. 정도로 해석되겠다.
상기 코드에 아래 코드를 추가해 주자.
randomSeed(analogRead(0)); // analogRead(0)의 값이 매번 다르다는 것을 추정해 볼 수 있다.
void setup() {
Serial.begin(9600);
randomSeed(analogRead(0));
for (int i = 0; i < 10; i++) {
uint8_t temp = random(0, 10);
Serial.print(temp);
}
}
void loop() {
}
아두이노의 리셋 버튼을 클릭할 때마다 매번 다른 번호가 출력되는 것을 확인할 수 있다.
랜덤 함수는 주사위나 빙고 게임을 코딩할 때에도 사용된다.
버튼을 클릭하면 주사위 1 ~ 6의 번호가 나오도록 하는 코드는 매우 간단하다.
random(1, 7); // 결과값이 중복되어도 상관없다.
빙고게임은 제시되는 숫자가 중복되면 안 된다.
5 x 5 배열 빙고게임
게임 참여자 두 명이 5 x 5 배열에 1 ~ 25까지의 숫자를 임의대로 넣고, 그 숫자는 중복되지 않아야 한다.
제시되는 숫자에 따라 숫자에 해당하는 칸을 지워나가고, 지워진 칸이 연속한 5칸이 되면 한 줄이 되고 5개의 줄이 먼저 생성되는 참여자가 이기는 게임이다.
이때 제시되는 숫자 역시 순서는 상관없으나 중복되지 않아야 한다.
아두이노를 이용하여 5 x 5 배열의 빙고 게임을 한다는 것은 아두이노를 이용하여 숫자를 제시한다는 것이다.
코드의 핵심은
1. 버튼을 누르면 정해진 범위 내의 숫자를 무작위로 만들어 낸다.
2. 앞서 나온 숫자와 중복되지 않아야 한다.
1번은 random(1, 26) 함수를 이용하면 쉽게 구현할 수 있다.
2번은 25개의 배열을 정의하고 첫 번째 버튼을 눌러서 나온 숫자를 배열 인덱스 0번에 저장한 뒤 참여자에게 숫자를 제시하고, 두 번째 버튼을 눌렀을 때 나온 숫자가 인덱스 0번의 값과 같은지 검사하여 같으면 다른 값이 나올 때까지 랜덤 함수를 실행하고 다른 값이 나오면 배열 인덱스 1번에 저장하고 참여자에게 숫자를 제시한다. 같은 방식으로 순서대로 숫자의 중복검사를 하면서 숫자를 저장하고 참여자에게 숫자를 제시하면 된다.
이어지는 글
[arduino] - 아두이노 - 배열 값 shuffle, 배열의 값을 무작위 순서대로 섞는 방법
'Arduino' 카테고리의 다른 글
아두이노 - 비트 시프트 연산자 (0) | 2019.10.16 |
---|---|
아두이노 - 비트 연산자 (0) | 2019.10.16 |
아두이노 우노와 NodeMcu의 성능 비교, MCU 속도 벤치 마크 (0) | 2019.10.16 |
아두이노 - 배열 값 shuffle, 배열의 값을 무작위 순서대로 섞는 방법 (0) | 2019.10.07 |
아두이노 - 무드등, 블루투스 연결 스마트폰 원격제어 (0) | 2019.10.05 |
ESP32 - 피에조 부저, 곰 세 마리 멜로디, tone() 대체 ledcWriteNote(), ledcWriteTone(), pitches.h 이용 (0) | 2019.10.04 |
ESP32 - PWM - analogWrite(), ledcWrite() - RGB LED 제어 (0) | 2019.10.03 |
ESP32 - 터치 센서를 활용한 터치 버튼, 터치 키패드 (0) | 2019.10.02 |