2009-10-13 10 views
7

마이크로 컨트롤러에서 난수를 효율적으로 생성하려면 어떻게해야합니까? 일반적인 지침이나 특정 빠른 방법이 있습니까?마이크로 컨트롤러에서 난수를 효율적으로 생성하려면 어떻게해야합니까?

+2

어느 정도의 난수가 필요합니까? 속도가 가장 큰 욕망입니까, 아니면 예측 불가능 성이 가장 중요한가? 서로 다른 목표를 가진 서로 다른 응용 프로그램을 겨냥한 의사 난수 생성을위한 많은 알고리즘이 있습니다. 예를 들어, 게임은 보안 성이 높은 암호화 코드를 생성하는 것과 같이 예측 불가능 성이 필요하지 않습니다. – Amber

+0

속도가 필요합니다. 암호화 요구 사항은 없습니다. – Donotalo

답변

5

당신은 질문은 다음이된다

선형 피드백 시프트 레지스터를 시뮬레이션하여 의사에게 비트의 조작에 의해 번호를 생성 할 수있다 '는 시뮬레이션하고 싶어 얼마나 많은 비트?'

Wikipedia 일부 정보가 있습니다.

+1

마이크로 컨트롤러가 리셋 될 때마다 동일한 세트의 난수가 생깁니다. 어떻게 피할 수 있습니까? 즉, 어떻게 임의의 시드를 설정할 수 있습니까? – Donotalo

+2

컨트롤러에 실시간 클럭이 없습니까? 그것은 씨앗처럼 행동 할 수 있습니다. –

+0

우리는 RTC를 가지고 있지만 그것을 사용하지 않는 것은 프로젝트 - 현명한 결정입니다. 펌웨어로 RTC를 시뮬레이션합니다. 댓글 주셔서 감사합니다. 펌웨어의 두 번째 카운터는 시드로 사용할 수 있습니다. – Donotalo

4

ADC에 액세스 할 수있는 경우 ADC에서 최하위 비트를 읽고 다른 사람이 게시 한 것처럼 의사 난수 생성기의 시드로 사용할 수 있습니다. 분명히 ADC에서 하나 이상의 비트를 읽어야하므로 여러 번 읽는 것이 필요하며 어느 정도 시간이 걸릴 수 있습니다. 그러나 예를 들어 시동시 한 번만 이렇게하면됩니다. 그런 다음 더 빠른 PRNG를 사용하여 새로운 난수를 생성하십시오.

많은 임베디드 장치에는 ATMega가 내장되어 있습니다 (예 : ATMega 제품군 Atmel).

+1

ATMegas의 ADC는 너무 안정적입니다. LSB조차도 많은 수치를 바꾸지 않습니다. http://skemman.is/stream/get/1946/10689/25845/1/ardrand.pdf "우리는 마이크로 컨트롤러 인 에서 진정한 무작위성을 추출하는 다양한 방법을 연구하고 임의성을 생성하는 데 사용하면 안된다고 결론 내립니다 아날로그 핀에서. " – endolith

9

하나는 일반적으로 의사 난수를 생성하지만 실제 난수는 생성하지 않지만 둘 다 다양한 속도로 가능합니다.

시퀀스가 ​​암호화 용도로 사용되는지 여부에 따라 두 가지 일반적인 범주가 있습니다. 주요 차이점은 시퀀스의 한 숫자에 대한 지식이 다음 숫자의 예측을 허용하는지 여부입니다. 범용 RNG는 알고리즘에 대한 지식으로 인해 관찰자가 시퀀스를 복제 할 수 있는지 여부에 대해 걱정하지 않고 훨씬 빠르게 실행됩니다.

일반적인 범용 RNG 알고리즘은 Mersenne Twister입니다. 다양한 알고리즘에 대한 공개 구현이 많이 있습니다. See here에 대해

MT가 너무 많은 메모리를 필요로하는 경우 반향 괜찮은 폴백은 linear congruential generator입니다. (이 MT는 1997 년까지 발명되지 않았습니다.)이 발전기에는 특정 문제가 있지만 메모리가 거의없고 코드가 거의 필요하지 않으며 매우 빠릅니다. 구현은 어디 에나 있으며 Knuth의 Seminumerical Algorithms에서 자세히 설명했습니다.

RNG를 시드하려면 엔트로피 소스가 필요합니다. 참고 : http://en.wikipedia.org/wiki/Entropy_(computing) (참고 : SO는 해당 링크에서()에 대해 혼동스러워합니다.) 일반적으로 CPU에서 관찰 할 수있는 타이밍 이벤트 키 스트로크, (나는 당신을 위해 작동하지 않을 것입니다) 인터럽트, 그리고 패킷 도착. 실시간 시계는 자체 상태를 유지하는 경우 수시로 허용되는 소스입니다. 즉, 재부팅이 거의 모든 순서로 시간이 정해지지 않기 때문입니다.

+0

이러한 RNG에는 작업 할 씨앗이 필요합니다. 마이크로 컨트롤러가 리셋 될 때마다 동일한 난수 세트를 얻습니다. – Donotalo

+0

아하, 좋은 질문이야. (우리는 기본 RNG 질문을 항상 여기에서 얻습니다. 그래서 기본적인 응답을 반사적으로 발사 해 주신 것을 용서해주십시오 :-) 어쨌든, 저는 제 대답을 업데이트했습니다. 나는 잠시 후에 또 다른 업데이트를 할 것입니다 ... – DigitalRoss

+0

Mersenne Twister는 마이크로 컨트롤러에 비해 너무 큰 상태 공간을 사용합니다. – starblue

1

가장 빠르고 가장 까다로운 의사 랜덤 넘버 생성기입니다. 명령 세트 (시프트 및 xor, 곱셈 또는 나눗셈 없음)는 메르 센 트위스터 아이디어 (일반 선형 피드백 시프트 레지스터라고도 함)의 작은 변형입니다. Mersenne 트위스터 자체는 마이크로 컨트롤러에 너무 많은 메모리가 필요합니다.

이러한 생성기의 문제점은 불행한 경우 0에 가까운 긴 시퀀스를 생성 할 수 있다는 것입니다. 타당한 크기의 상태 공간과 다른 PNRG로부터의 초기화로 이것은 가능하지 않을 것이다.

또한 암호화 또는 도박에 안전하지 않은 지능형 적수는 산출물을 관찰 한 후 미래 상태를 예측할 수 있습니다. 선형이기 때문입니다.

약 50 개의 24 비트 단어의 상태 공간을 가진 소형 비표준 프로세서 용 생성기를 한 번 설계했습니다. 나는 좋은 것을 발견 할 때까지 Diehard 테스트 스위트로 변종을 테스트했다. 응용 프로그램이 하드웨어 테스트를 위해 임의의 변형을 생성하고있었습니다.

2

하드웨어에 사용자를위한 버튼이있는 경우 간단한 방법은 버튼을 얼마나 길게 누르는 지 계산하는 것입니다. 카운터가 충분히 빠르면 "임의의"숫자가 표시됩니다.

+1

'x'Hz의 카운터 속도가 주어지면 엔트로피의 비트 수를 추정 할 수 있습니까? –

+0

죄송합니다. 나는 똑똑한 누군가가 그것을 알아낼 수 있었다고 생각한다. –

+0

이것은 좋은 해결책이지만 제 경우에는 사용자 상호 작용이 일어나기 훨씬 전에 난수가 필요합니다 (실제로 마이크로가 힘을 얻자 마자).생각에 감사드립니다. – Donotalo

0

일련의 비트로 타이머 및 xoring/nanding/etc를 읽으면 세미 랜덤이 사용자에게 제공됩니다. 이벤트 사이의 타이밍은 사용자가 실제로 알 수 없을 정도로 충분할 것입니다 타이머와의 상관 관계.

8

시드를 EEPROM에 저장할 수 있으며 장치가 부팅 될 때 시드를 증가시키고 다시 저장할 수 있습니다. 그래서 재부팅 할 때마다 다른 난수가 생깁니다.

0

핀을 부동 상태로 둘 수 있으면 선형 피드백 시프트 레지스터을 사용하여 난수를 생성하는 데 도움이 될 수 있습니다.

// This code was written for 8051 (AT89S52) 
unsigned char lfsr = 231; //8 bit shift register, with the seed of 231 or '11100111b' 
unsigned char input_bit, i; 

void main (void) 
{ 
    //Setup 
    P0_0 = 0; // Leave Pin 0 Port 0 floating 
    uart_init(); //Initializing uart/serial communication with pc 


    while (1) 
    { 
     for (i = 0; i < 255; i++) 
     { 
      if (P0_0 == 1) // If Pin 0.0 is HIGH 
      { 
       input_bit = ((lfsr >> 0)^(lfsr >> 2)^(lfsr >> 3)^(lfsr >> 4)) & 1; 
       lfsr = (lfsr >> 1) | (input_bit << 7); 
      } 
     } 
     printf_tiny("%u\n", lfsr); //Send the random number to PC 
     soft_delay(65535); //Simple delay function 
    } //end while (1) loop 

} 

편집 : :이 갈 수있는 방법이지만, 내 코드에서 참조하시기 바랍니다 모르겠어요 내 대답은 나쁜 하나가 될 수 있습니다 발견. 플로팅 디지털 핀을 사용하지 않아야하는 이유에 대한 자세한 내용은 https://electronics.stackexchange.com/questions/50476/random-number-generators-using-a-gpio-pin

관련 문제