난수 생성기에서 가장 작고 간단한 시드는 무엇입니까?


40

소형 마이크로 컨트롤러 (8 비트 Atmel)는 수많은 무작위 무작위 조명 시퀀스로 조명 쇼를 나타 내기 위해 많은 조명을 제어합니다.

적절한 의사 RNG가 잘 작동하지만 좋은 씨앗을 찾고 있습니다. 누군가가 동시에 여러 장치를 켜면 개별 클럭 소스의 작은 차이로 인해 천천히 표류 할 때까지 동일한 효과 시퀀스를 생성하면 좋지 않을 것이므로 시드가 필요합니다.

내가 자주 사용하는 pseudo-RNG를 시드하는 매우 좋은 방법은 버튼을 누르거나 스위치를 돌려서 시작 해야하는 장치의 경우 가능합니다. µc의 전원을 켜 자마자 매우 빠른 타이머를 시작할 수 있으며이 타이머의 값은 버튼을 처음으로 누르는 즉시 RNG를 시드합니다.

문제는이 시나리오에서 버튼이 없다는 것입니다. 장치의 전원을 켜 자마자 프로그램을 시작해야합니다.

PCB의 위치는 극히 제한적 이며 (가장 작은 SMD 부품 중 일부만 적합 할 수는 없음) 가장 작고 간단한 솔루션을 찾고 있습니다. 따라서 진정한 RNG 하드웨어, 라디오 수신기 등과 같은 멋진 솔루션을 배제하겠습니다.

내가 가진 것은 CPU의 16 비트 타이머 카운터와 ADC에 액세스 할 수있는 사용되지 않는 포트 핀입니다.

내 현재 솔루션은 저항을 사용하여 가능한 한 정확하지 않은 ADC 핀에 공급 전압의 약 절반을 제공하고 첫 번째 AD 변환 값으로 RNG를 시드하는 것입니다. 그러나 현재 대부분의 10 % 저항기는 1 % 미만의 정확도를 가지고 있습니다 (공급 업체가 최악의 품질의 SMD 저항기를 찾을 수 있다고 말하면 재미있을 것입니다). 동일한 시드로 시작하는 여러 유닛.

더 나은 대안은 여러 변환을 수행하고 이러한 측정에서 가장 중요하지 않은 값으로 값을 작성하는 것입니다. 그러나 나는 이전에이 µc 유형의 ADC를 사용했으며 매우 정확하다는 것을 알고 있습니다. 가장 빠른 속도로 ADC를 실행하면 도움이 될 수 있습니다.

더 나은 제안이 있습니까? 종자는 완벽하게 균일하게 분포 될 필요는 없지만, 분포가 균일할수록 더 좋습니다. 완벽하게 균일 한 분포를 가진 16 비트 시드는 현실화하기에는 너무 좋은 꿈이지만 5 또는 6 비트에 대한 중간 정도의 분포는 충분하다고 생각합니다.


12
"내가 찾을 수있는 최악의 품질의 SMD 저항을 원한다고 말하면 공급 업체의 얼굴을 상상하는 것이 재미있을 것입니다." pcb가 배치 기계에서 나온 후 우리가 가진 모든 저항 값을 함께 혼합 한 빈에서이 부품을 수동으로 납땜해야하는 생산 담당자. -내가 찾고있는 RNG가 아니라 씨앗 입니다. 따라서 거의 나쁘지 않을 때마다 거의 동일한 값을 생성하면 장치마다 다른 것이 더 중요합니다.
vsz

8
프로덕션 프로그래밍 중에 EEPROM 스토리지에 임의의 값을 쓰지 않는 이유는 무엇입니까? 이런 식으로 최종 장치가 아닌 프로덕션 프로그래머에게만 해당되므로 가장 멋진 RNG를 사용할 수 있습니다. (@immibis의 공로 : '약간 다른 소프트웨어 파일'이 나에게 아이디어를 주었다.)
Calrion

2
따라서 100 % 명확하게 말하면 문제는 시간이 지남에 따라 표류 할 수있는 것이 아니라 동일한 순서로 시작될 수 있다는 것입니다.
wedstrom

2
RNG의 선택이 중요합니다. 일부는 양질의 씨앗이 필요하고 다른 것은 그렇지 않습니다. 예를 들어 Xorshift의 경우 0 이외의 시드가 작동하고 동일하게 작동합니다. 초기 시드의 작은 차이조차도 RNG 사이클에서 시작 위치가 매우 다릅니다.
curiousdannii

3
모든 ADC 응답을 통계 및 타이밍과 결합하여 훨씬 더 많은 무작위성을 얻을 수 있습니다. 예를 들어, 하위 3 LSB가 101 인 N 샘플과 하위 3 LSB가 110 인 M 샘플을 취할 때까지 걸리는 프로세서 틱 수를 측정하십시오.이 개념을 원하는대로 확장하십시오.
wjl

답변:


24

병렬 저항과 커패시터를 A / D 핀과 접지 사이에 놓으십시오. A / D에 대한 입력 신호 임피던스 요구 사항보다 훨씬 높은 저항을 상당히 높게 설정하십시오. RC 시간을 약 10 µs로 일정하게 만드십시오. 예를 들어 100kΩ과 100pF는 좋은 조합처럼 들립니다.

임의성을 가진 값을 얻으려면 핀을 잠시 하이 드라이브로 구동 한 다음 높은 임피던스로 설정하고 몇 µs 후에 A / D 판독 값을 가져옵니다. 특히 A / D 획득 시간을 올바르게 남용하는 경우 표시되는 전압은 R 및 C 값, 핀 누설 전류, 기타 주변 소음 및 온도에 따라 달라집니다.

하위 비트 또는 하위 2 비트를 잡고 임의의 수의 임의 비트를 얻기 위해 필요한만큼 반복하십시오.

보다 임의의 패턴을 위해이 절차를 가끔 수행하고 이미 사용중인 난수 생성기에 A / D 결과의 하위 비트를 주입하십시오.


잘 들립니다. ADC의 입력 임피던스를 확인하십시오. Atmega8 시리즈는 아날로그 입력 임피던스가 100Meg이므로 Olin의 저항 값이 약간 낮아집니다.
stefandz

3
@stef : 올바른 변환에 필요한 입력 임피던스와 신호 임피던스는 서로 다른 두 가지입니다. 그렇습니다. 입력 임피던스는 CMOS이기 때문에 매우 높습니다. 그러나 지정된 시간 내에 샘플을 충전하고 캡을 고정하고 핀의 누설을 극복 할 수 있도록 신호에 최대 임피던스 제한이 있습니다.
Olin Lathrop

2
죄송합니다, 귀하의 답변에서 소스 임피던스 사양이 아닌 입력 임피던스를 참조한다고 생각했습니다. 10k는 Atmega8에 지정된 최대 소스 임피던스이므로 답이 정해집니다. 참고로 S / H 캡 내부는 14pF입니다.
stefandz

2
@ stef : 더 명확하게하기 위해 답을 편집했습니다.
Olin Lathrop

음력 및 은행 공휴일을 놓쳤습니다. 또한 특히 C가 낮고 차폐가 잘되지 않는 경우 유용한 추가 기능을 손으로 흔 듭니다.
Russell McMahon

23

몇 가지 가능한 옵션 :

  1. 각 장치에 대해 고유 한 일련 주소를 사전 프로그래밍하십시오. 충분한 RNG 알고리즘이 있으면 일련의 일련 주소 목록조차 매우 다른 결과를 생성합니다.

  2. MCU / 설정에 따라 시스템 클록과 워치 독 타이머 / 타이머 카운터 입력에 사용할 수있는 두 가지 클록 소스가있을 수 있습니다. 이들 중 하나 / 둘 다에 상당한 차이가있는 경우이를 사용하여 적절히 다른 시드를 생성 할 수 있습니다. 다음은 Arduino의 내부 감시 타이머 및 외부 XTAL 시스템 시계를 사용하는 예제 입니다.

  3. BJT 트랜지스터를 사용하고 베타 의존적 증폭기를 구축하십시오. 이것은 시드에 대한 ADC에서 읽을 수 있습니다.

  4. 커패시터 / 인덕터는 일반적으로 저항보다 훨씬 더 나쁜 공차로 지정됩니다. 이것으로 일종의 필터 회로 (RC, RL, LC)를 구축하고 ADC로 출력을 측정 할 수 있습니다.


5
옵션 1에 투표하면 시퀀스가 ​​일치하지 않아도되는 부품 수 제로 솔루션입니다. 일련 번호와 RND 생성기는 16 비트라고 말하면 모든 장치가 다른 장치의 패턴을 모방 할 가능성이 거의 없습니다.
KalleMP

1
나는 또한 해결책 하나를 좋아한다. 간단한 해싱 알고리즘을 사용하면 일련 번호가 있어도 괜찮습니다.
magu_

6
옵션 1의 좋은 점은 일부 장치에는 내장 일련 번호 (일반적으로 네트워크 / RF 관련 마이크로)가 제공되므로 일련 번호를 구울 때 별도의 단계가 필요하지 않다는 것입니다
slebetman

3
심지어 같은 쓰레기 RNG LCG는"직렬 주소의 순차적 인 목록 격렬하게 다른 결과를" . 나는 또한 1에 투표합니다.
BlueRaja-대니 Pflughoeft

3
시간 소스가있는 경우 시드를 전환하기위한 기반으로 사용하면 실행 사이의 상황을 상쇄하는 데 도움이됩니다. 장치에 직렬 주소 / 번호 또는 MAC 주소가 있으면이를 조합하여 장치 간 일치도 수정하십시오. 재부팅 후에도 시드로 사용하기 위해 생성 된 일부 또는 모든 임의의 숫자를 지속적으로 저장하는 소프트웨어를 보았습니다. 장치의 작동 시간이 다르면 표류해야합니다.
TafT

8

초기화되지 않은 메모리

마이크로 컨트롤러에서 초기화되지 않은 메모리를 사용하려고 할 수 있습니다. 트릭은 가장 '평형'플립 플롭이 있고 실제로는 랜덤 한 비트를 찾는 것입니다. 절차는 모든 메모리를 읽고 재설정하고 몇 번 반복하여 어떤 비트가 실제로 임의인지 측정하는 것입니다. 그런 다음이 맵을 사용하여 PRNG 또는 LFSR을 시드하기에 충분한 임의의 비트를 읽습니다!

이 방법은 당신에게 무작위 씨앗, 심지어 동일한 하드웨어로, 자세한 내용 (링크)을 얻었다이 해킹-A-일에서 사용할 수 있어야 기사

추가 회로 나 핀이 필요하지 않기 때문에이 방법이 마음에 듭니다. AVR에 이미 램이 있다면 불안정한 (무작위) 비트 만 찾으면됩니다. 또한 매핑 절차를 자동화 할 수 있습니다. 각 장치에 동일한 코드와 절차를 적용 할 수 있으며 실제로 임의의 결과를 얻을 수 있습니다!


1
어떤 비트가 무작위인지 알아낼 필요는 없습니다. 모든 바이트를 XOR-ing하면 8 비트 만 임의 임에도 불구하고 임의의 결과를 얻을 수 있습니다. 그리고 그림에서 알 수 있듯이 실제 값은 일시적인 의미에서 임의적이지 않을 수 있습니다.이 값은 고유해야합니다. 정확히 우리가 여기에 필요한 것입니다.
MSalters

1
엔트로피를 "혼합"할 수있는 PRNG를 찾을 수 있다면 XOR-then-seed 옵션보다 훨씬 좋습니다. 초기화되지 않은 메모리를 반복하고 PRNG에 바이트를 혼합합니다. 예를 들어, simplerandom C 라이브러리 인 mix 함수를 참조하십시오 .
Craig McQueen

이것은 암호화 품질의 무작위성을 제공하지 않습니다.

@CamilStaps는 물론 아닙니다.
Navin

1
작동하지 않습니다. 초기화되지 않은 메모리는 운영 체제가 있고 메모리에 어떤 부분이 내 프로그램에 할당되고 이전에 무엇이 있었는지 제어 할 수없는 경우 정의되지 않은 동작입니다. OS가없는 마이크로 컨트롤러에서는 그렇지 않습니다. 특히 AVR의 경우 전류 소비에 의해 커패시터가 비워 질 때까지 충분한 시간이 경과하면 모든 RAM이 0이되기 때문에 브라운 아웃 상태입니다.
vsz

7

무작위 기능을 가진 MP3 플레이어에서 내가 한 일은 전원을 켤 때마다 다른 순차적 시드를 사용하는 것입니다. 나는 1에서 시작하여 다음 전원 사이클에서 2 등을 사용하도록 이것을 EEPROM에 저장했습니다. 이것은 ATMEGA168에있었습니다. helloworld922가 지적했듯이 간단한 순차 시드조차도 완전히 다른 의사 랜덤 시퀀스를 생성합니다.

선형 합동 랜덤 시퀀스 생성기 중 하나를 사용했는데, 이는 균일 한 분포를 제공합니다.

int i;
seed = seed * 2053 + 13849;
i = (seed % max) + 1;  // max is the maximum value I want out of the function

물론 동일한 수의 전원주기를 가졌더라도 여러 장치가 서로 다른 시퀀스를 갖기를 원한다면 무작위로 시작해야합니다.

이것은 다른 포스터가 제안한 방법 중 하나를 통해 수행 할 수 있습니다. 필자가 생각할 수있는 한 가지 방법은 프로세서가있는 경우 AC 제로 크로싱을 사용할 수 있습니다 (예 : 램프 위상 제어)? 전원을 켠 후 첫 번째 교차점에서 타이머를 샘플링하고 시드로 사용할 수 있습니다.

모드 등을 선택하기위한 장치에 푸시 버튼이 있습니까? 따라서 MCU를 프로그래밍 한 후 버튼을 처음 누르면 카운터를 샘플링 할 수 있으므로 초기에 임의의 시드를 생성하여 EEPROM에 저장할 수 있습니다. 이 시점 이후의 모든 전원 공급은 저장된 시드를 사용합니다.


5

ADC는 무작위성에 대한 매우 좋은 소스입니다.

저항 공차에 의존 할 필요는 없습니다. 모든 저항은 열 잡음 을 발생 시킵니다 모든 샘플링 및 변환 단계를 수행 할 때 동일한 물리적 효과로 인해 ADC에 잡음이 발생합니다. (데이터 시트에 노이즈 양과 최악 / 최고의 구성 설정에 대한 정보가 있습니다.)

ADC 핀을 떠 다니지 마십시오. 이로 인해 전압이 너무 멀리 떨어지고 입력이 포화 될 위험이 있습니다.
(많은 MCU를 사용하면 교정을 위해 공급 전압의 절반과 같은 것을 ADC 입력으로 사용할 수 있습니다. 이렇게하면 외부 저항이 절약되고 여전히 노이즈가 발생합니다. 다시 말해 최악의 / 최상의 구성에 대한 데이터 시트를 참조하십시오.)

단일 ADC 측정에 의존 할 필요는 없습니다. 여러 측정을 간단한 해시 또는 체크섬 기능과 결합 할 수 있습니다 (CRC로 충분). RNG 사용을 즉시 시작해야하는 경우 나중에 ADC 결과를 현재 RNG 시드와 결합 할 수 있습니다.


2
존슨 노이즈가이 애플리케이션에 적합한 지 잘 모르겠습니다. STP에서 10kHz 대역폭 이상의 10Meg 저항 40uV은 Johnson 노이즈를 갖습니다 . 이것을 합리적으로 측정하려면> 14 비트 ADC 또는 증폭기 회로가 필요합니다.
helloworld922

STP는 실제로 관련이 없습니다. 특히 온도를 의도적으로 올릴 수는 있지만 STP보다 60도 가량 더 높으면 추가로 10 %가 추가됩니다.
MSalters

1
유사한 접근 방식은 다이오드에서 샷 노이즈를 사용하는 것입니다. en.wikipedia.org/wiki/Noise_generator#Shot_noise_generators
teambob

2

시드를 세션마다 저장할 수 있습니까? 그렇다면 생성시 임의의 시간 동안 모든 장치를 켤 수 있습니까? 그렇게하면 모든 장치에 동일하지 않은 사전 설정 시드가 제공됩니다.

또 다른 생각 : 여러 장치를 어떻게 연결하여 동시에 켜는가? 직렬로 연결된 경우 n + 1 번째 디바이스가 n 번째 디바이스 다음에 몇 클럭 사이클을 시작하도록 일종의 커패시터를 추가하십시오. 이상적으로 커패시터는 장치 종료시 매우 빠르게 방전되므로 시작 / 재시동 할 때마다 시퀀스 사이에 더 큰 간격이 있습니다.

그것들이 병렬 인 경우에도 시동 시간을 조금 무작위로 지정할 수 있습니다. 커패시터를 사용하는 일종의 전력 여과가 있다고 가정합니다. 그렇다면 여과 회로가 약간 다른 장치를 제조하면 각 장치가 약간 다른 시간에 시작되어 여러 번 다시 시작한 후 분기가 발생합니다.

이에 대한 변형은 가능한 경우 클록 신호에 분산을 추가하는 것입니다. PRNG 테이블을 순회하는 속도를 변경하는 동안 클럭 속도의 0.1 % 차이는 조명 쇼에 거의 영향을 미치지 않을 수 있습니다.


1
아마도 핀에 아날로그에 대한 많은 쏟아짐을 연결하고 RNG를 시드하기 위해 "메인 윙윙"을 읽습니다.
Jasen

1
@Jasen, 동일한 확장 리드에 연결된 모든 장치에는 동일한 전원 잡음이 나타납니다.
이안 링 로즈

2

내부 "보정 된"클럭 소스에서 실행중인 경우. EEPROM보다 선호되는 시간이 지난 후에 시드를 저장할 수 없었습니다. 시계가 표류하고 단위마다 다릅니다. 일정 시간이 지난 후 (매 10 분 정도 또는 장치의 정상 작동 시간 내에 발생할 수있을 정도로 짧은 시간 후) 새 값을 저장하려면 장치가 더 오래 켜져있을수록 더 많은 시간을 절약 할 수 있습니다. EEPROM에 "다른"값.

또한 장치가 켜져있는 동안 (EEPROM에이 새 값을 저장) 매번 한 번 도약 한 다음 (자주는 아님) 다시 시드하십시오.


2

LDR 또는 서미스터를 추가하여 다양한 저항을 기반으로 AD 변환의 원래 아이디어를 확장하는 것은 어떻습니까? (첫 번째는 외부에서 "보일 수 있어야"할 수 있을지 모르겠지만, 빛의 변화는 거의 같은 장소에서 같은 시간에 시작된 장치들 사이의 온도 변화보다 높을 수 있습니다. ..)


1
서미스터에는 또 다른 유용한 속성이 있습니다. 대부분의 제조업체의 여러 시리즈는 엄청난 차이와 부정확성을 가지고 있습니다. 이것은 결과를 더욱 향상시킬 것이다.
Ariser

1

단위당 고유 한 시드가 필요하다고 가정하는 두 가지 잠재적 솔루션.

  1. 출고시 장치를 하나씩 플래시하는 경우 프로그래머의 일부 중간 스크립트로 16 진 파일을 프로그래밍 방식으로 수정할 수 있습니다. PC로 제어되는 경우 날짜 및 시간으로 변수 초기화를 덮어 쓸 수 있습니다. 각 유닛마다 고유해야합니다!

  2. Dallas 1 와이어 장치는 하나의 핀만 사용하며 각각 고유 한 64 비트 일련 번호가 제공됩니다. 이것을 씨앗으로 사용할 수 있습니다.


1
나는 2를 좋아하지만 불행히도 DS 부분은 모두 비싸다.
Ariser

암호화 품질 임의성에 프로덕션 타임 스탬프를 사용하지 마십시오. 예측 가능합니다.

2
영업의 응용 프로그램에 대한 @CamilStaps는, 암호화 수준이 필요하지 않습니다
하겐 폰 Eitzen을

1
@HagenvonEitzen은 사실이지만 다른 사람들은 crypto-Q 임의성을 찾기 위해이 질문에 올 수 있으므로 언급 할 가치가 있습니다.

4
@CamilStaps Sigh , 그것은 당신이 인류를 포기한 것 같습니다 :) 암호 목적으로 electronicsSE의 답변을 사용하고자하는 사람이 적어도 대답해야 할 질문을 읽을 정도로 충분히주의를 기울 이기를 기대하는 사람에게는 너무 까다로운 일입니까 ? "16 비트"또는 "5 O5 6 비트"씨앗은하지 암호화-Q도 : 슈뢰딩거의 고양이의 무리에 의해 생성 된 경우
하겐 폰 Eitzen

1

부동 ADC 핀을 남겨두고 난수 생성기 (RNG)에 포착 된 노이즈를 공급할 수 있습니다. 시드를 생성하거나 RNG 생성기로 사용하기에 충분해야합니다.

가능한 최소 변환 시간을 사용하는 것을 잊지 마십시오.

다른 솔루션은 ADC 핀에 적용된 노이즈 생성기 일 수 있습니다 .


2
몇 가지 측정을 수행 할 것입니다. 그러나 올바르게 기억하면 부동 ADC 핀이 읽 0거나 가까이에 옵니다 0. 그 경우인지 다시 확인하겠습니다.
vsz

1
관심이 있습니다. 0플로팅시 읽 습니까?
Bence Kaulics

2
문제는 이것이 개발 보드에서 작동하고 최종 제품에서 실패 할 수 있다는 것입니다.
vsz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.