본문 바로가기

메이커 이야기/아두이노

[아두이노 랜덤] 완벽한 랜덤 값 생성

반응형

완전 랜덤 만들기

 

C 언어의 경우 random 함수를 사용하면 완벽한 random 값을 생성할수 없습니다.

그래서 하드웨어의 특성을 이용해서 완벽한 랜덤값을 생성해 보도록 하겠습니다.

 

사용 부품

아두이노 UNO  x 1

 

코드

void setup() {

  Serial.begin(9600);
  Serial.print("analogSignal");
  Serial.print("\t");
  Serial.print("val");
  Serial.print("\t");
  Serial.print("randsid");
  Serial.print("\t");
  Serial.print(" -> ");
  Serial.println("randomValue");
  Serial.println("--------------------------------------------------------");

}

 
void loop() {

  Serial.print(analogRead(A0));
  srand(analogRead(A0));
  int val = random(0, 100);
  int randsid = analogRead(A0)*val;
  srand(randsid);
  Serial.print("\t\t");
  Serial.print(val);
  Serial.print("\t");
  Serial.print(randsid);
  Serial.print("\t");
  Serial.print(" -> ");
  Serial.println(random(0,10000));
  delay(2000);
  
}

 

 

코드 뜯어보기

 

srand( analogRead(A0) ) : 랜덤 함수의 시드를 바꾸어 주는 함수

C언어 기반인 스케치의 특성 , C언어의 Random함수가 가진 문제점을 그대로 상속

랜덤 시드 변경없이 랜덤 값을 호출하면 기본 시드에 의해 정해진 순서를 따라 값이 반환

컴퓨터로 랜덤 시드 변경없이 호출하는 것을 30번을 반복했으나

7 -> 9 -> 3 -> 8 -> 0 -> 2 -> 4 -> 8 -> 3 -> 9 … 패턴이 변함없이 나오네요!

 

코드 실행화면(시리얼 모니터)

 

randsid값은 양수인 analogRead(A0) val 곱인데 음수로 출력되는 이유는 16bit 보드인 UNO
int
자료형의 최대값인 32,767 넘어갔기 때문에 Overflow 발생하여 음수가 것이다.

 

 

음수를 발생시키지 않기 위해서 unsigned로 변수를 선언한다면??~

 

 

 

그래서...

완전한 랜덤값을 왜 생성하는거죠???

 

물론... 조금더 나간 개념일수도 있지만, 난수라는게 반드시 필요한 분야가 있죠!!!

어딜까요???

 

바로 보안입니다.

 

그럼 이걸로???!! 음... 그것 까진... 

반응형