하드웨어 난수 생성기 개선


53

당신의 임무는 주위에있는 하드웨어와 하드웨어 난수 생성기를 개선하는 것입니다.

도전

다음 속성을 가진 프로그램을 작성하십시오.

  1. 0또는 하나만 인쇄합니다 1.
  2. 출력은 컴퓨터의 내부 상태뿐만 아니라 실제 프로세스에 따라 다릅니다.
  3. 후속 런의 출력 (1 분 간격)에는 관계가 없습니다.
  4. 현실적인 노력으로 결과를 예측할 수 없습니다.
  5. 출력 확률은 00.2와 0.8 사이입니다.
  6. 상당히 높은 확률로 1 분 이내에 실행됩니다.

명확하지 않은 경우 프로그램에 이러한 속성이있는 이유를 설명해야합니다.

설명 및 제한

다음은 인기 경연 대회에 대한 많은 제한 사항처럼 보일 수 있지만 궁극적으로 프로그램이 문제의 정신 내에 머무르고 다소 효과가 있으며 전체 과잉 행동으로 인해 인기가 있지만 궁극적으로 해결책을 피하는 것이 전부입니다. 오히려 지루합니다.

  • 시스템 시간은 실제 프로세스로 계산되지 않습니다.
  • 난수 생성 용이 아닌 한 8 인치 floopy-disk 드라이브에서 USB 로켓 실행기 와 헤드폰에 이르기까지 원하는 소비자 용 하드웨어를 사용할 수 있습니다 . 하드웨어는 대량 생산되고 1000 $ / € / £ 미만인 경우 소비자 급 제품 이므로 라디오 망원경, CERN, MRI 또는 ​​가정용 입자 탐지기를 사용할 수 없습니다.
  • 전원 스위치가있는 경우 스위치를 켜고 올바르게 설치하고 작동하는 등 하드웨어의 상태 및 정렬에 대한 가장 기본적인 가정 만 할 수 있습니다. 예를 들어 CD 드라이브가 일반적으로 디스크를 읽을 수 있고 용지가 걸리지 않는다고 가정 할 수 있지만 CD를 열거 나 닫거나 디스크를 포함한다고 가정 할 수는 없습니다. 다른 예에서는 특별한 상호 작용을 허용하기 위해 두 개의 하드웨어를 정렬 할 수는 없지만 같은 방에 있다고 가정 할 수 있습니다.
  • 하드웨어가 고장 나지 않는 한 원하는 상태로 둘 수 있습니다.
  • 하드웨어가 자연 환경에 있다고 가정 할 수 있으며 그 이상은 아닙니다. 예를 들어, 하드웨어가 액체 헬륨 탱크 나 소음이 적고 가벼운 방이나 공간에 있지 않다고 가정 할 수 있습니다. 그러나 급격한 노력으로 만 피할 수있는 것을 제외하고는 사운드 및 광원이 있다고 가정 할 수 없습니다.
  • 프로그램은 비전이 아닌 운영 체제를 선택한 표준 데스크탑 컴퓨터에서 실행해야합니다. 난수 생성 용으로 특별히 설계되지 않은 소프트웨어를 사용할 수 있습니다.
  • 인터넷에 접속할 수 없습니다.
  • 사람이 참석하거나 결석 한 것으로 가정 할 수는 없지만 팬을 수동으로 중지하거나 가능한 한 자주 마이크를 끄는 것 외에는 아무것도하지 않는 프로그램을 실행하여 의도적으로 프로그램을 방해하는 사람은 없다고 가정 할 수 있습니다.
  • 소프트웨어 설정에 대한 가장 기본적인 가정 만 할 수 있습니다. 예를 들어 드라이버를 설치하고 활성화한다고 가정 할 수 있지만 사운드를 소거 할 준비가되어 있어야합니다.
  • 소프트웨어 설정을 원하는 상태로 둘 수 있습니다.

보너스

특히 짧은 솔루션에 특별한 현상금이 수여되었습니다. 이것은 오히려 많은 명령에 의한 것이며 문자보다는 유사합니다. 우승자는 (내 기준에 따라 묶여 있음) :

  • Franki의 답변 입니다.
  • Tejas Kale의 답변 입니다.

Tejas Kale의 답변은 한 가지만 수상 할 수있었습니다.


2
최신 스마트 폰 및 랩톱에있는 자이로 스코프는 소비자 하드웨어로 간주됩니까?
Nzall

@NateKerkhofs : 예.
Wrzlprmft

실제로 "소비자 급 하드웨어"에 대한 정의를 얻을 수 있습니까? "귀하의 컴퓨터 판매점에서 500 달러 미만으로 구매할 수 있거나 1,000 달러 기계의 일부로 구입할 수있는 것"이 ​​허용 가능한 정의입니까?
Nzall


1
여기에 약간의 퀴즈를 삽입하겠습니다. 호주 국립 대학교에서 실행되는 양자 역학을 기반으로 한 실제 난수 생성기가 있습니다. 살펴보기 : qrng.anu.edu.au/index.php
Alexandre Teles

답변:


28

껍질

마이크 스트림에서 단일 샘플을 읽고 잡음에 의해 지배되어야하는 가장 중요하지 않은 비트를 인쇄합니다.

편집 : 마이크 음소거를 해제하도록 변경되었습니다 ... 및 기타 모든 것!

# Warning - unmutes EVERYTHING!
for DEV in `amixer | grep Simple | sed -e "s/.*'\(.*\)'.*/\\1/" -e "s/ /~/g"`
do
    amixer -q -- sset "`echo $DEV | sed 's/~/ /g'`" unmute 100% 2>/dev/null
done

echo $(( `od -N1 -d < /dev/dsp | head -n1 | sed 's/.* //'` & 1 ))

마이크를 음소거하면 어떻게 되나요? 이것이 완전한 침묵이 아니어야합니까?
yeti

3
@yeti : 글쎄요. 그러나 우리는 "하드웨어가 켜져 있고 기능적"이라고 가정 할 수 있습니다.
ELL

3
모든 것을 음소거 해제하는 것은 나에게 "의사 무작위"이진 발생기에 큰 (그리고 성가신) 부작용이다 ^^
Olivier Dulac

1
cat /dev/urandom > /dev/dsp컴퓨터가 방음 실 / 챔버 / 상자 / 케이스 / 공간에있는 경우를 위해을 사용하여 스피커에 데이터를 공급할 수 있습니다.
Ismael Miguel

내가하고 싶은 것!
반바지 이론

26

세게 때리다

echo $[`ping -qc1 127.1|sed 's/[^1-9]/+/g'`0&1]

단일 핑의 응답 시간에서 로컬 호스트까지 엔트로피를 수집합니다.

응답 시간은 ping -qc1다음 의 결과에서 정확히 세 번 나타납니다 .

PING 127.1 (127.0.0.1) 56(84) bytes of data.

--- 127.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.044/0.044/0.044/0.000 ms

다른 모든 숫자는 응답 시간과 관계없이 일정하며 더 중요합니다.

sed 's/[^1-9]/+/g'0과 숫자가 아닌 모든 숫자를 더하기 부호로 변환 echo $[...0&1]하고 결과 합계의 패리티를 인쇄합니다.


1
: 그것은 항상 나를 위해 일을 인쇄 CYGWIN_NT-6.2-WOW64 work 1.7.28(0.271/5/3) 2014-02-09 21:06 i686 Cygwin- ping이 둘 -q또는 -c여기에.
rr-

2
Windows 사용이 ping확인되었습니다. 놀랐어요.
rr-

1
@JamesSnell : 그때 문제입니다. Windows 핑의 정밀도가 충분하지 않습니다. 그것은 항상 1ms의 시간을 보여줄 것이다 ...
Dennis

6
이것이 제한 # 2를 위반 한 것 같습니다 : 핑 로컬 호스트 핑은 전적으로 컴퓨터의 내부 상태에 의존합니다.
tophyr

2
말하기 어렵다. @Dennis : 변동이 어디에서 발생하는지 알고 있습니까?
Wrzlprmft

25

자바 스크립트 + HTML5 DeviceMotion

var hash = function(x) {
    var h = 0
    for (var i = 0; i < x.length; i++) {
        h += x.charCodeAt(i)
        h ^= h << 5
        h ^= h >> 3
        h ^= h << 13
        h &= 0xffff
    }
    return h
}
var listener = function(e) {
    var accelerationString = JSON.stringify(e.acceleration)
    var hashed = hash(accelerationString)
    alert(hashed % 2)
    window.removeEventListener("devicemotion", listener, true)
}
window.addEventListener("devicemotion", listener, true);

여기 JSFiddle .

지원되는 장치 (대부분 모바일 장치)에서 HTML5 DeviceMotion API를 사용합니다. 결과 acceleration객체를 JSON으로 변환하고 해시하며 나머지 모듈로 2를 사용합니다.

대부분의 코드는 해시 함수입니다 (자바 스크립트와 표준 라이브러리가 없음). 아마도 더 짧을 수도 있지만 좋은 해시 함수를 좋아하는 사람입니다.


40
"새 비밀번호를 생성하려면 기기를 흔들어주세요."
PTwr

21

파이썬 + 웹캠

여기서 뻔뻔하게 도난당한 코드를 사용하여 웹캠을 사용하여 p 샷을 찍고 데이터를 해시하며 최하위 비트를 인쇄합니다.

#!/usr/bin/python
import pygame.camera, hashlib

pygame.camera.init()
cam = pygame.camera.Camera(pygame.camera.list_cameras()[0])
cam.start()
raw = cam.get_raw()
cam.stop()
pygame.camera.quit()

h = hashlib.sha256()
h.update(raw)
print ord(h.digest()[-1]) % 2

8
좋은 해시에는 "최소 비트"가 없습니다. 그래, 네가 무슨 뜻인지 알아
gnibbler

11
@ 11684, 카메라에 동일한 결과를 방지하기에 충분한 열 노이즈 등이있을 수 있습니다.
gnibbler

2
빛은 상당히 약간 변동해야합니다 (외부 조명이 올라가거나 내려가는 것, 물론 컴퓨터가 방출하는 "깜박임")
Olivier Dulac

7
이것은 내 친구가 한 일을 느슨하게 근거로합니다. 그는 방사성 붕괴를 사용하여 진정한 난수를 생성하는 데 관심이있었습니다. 그는 웹캠과 연기 경보기를 해체하고 동위 원소를 CCD 옆에 놓고 감지 된 베타 방출 위치를 / dev / random에 공급하는 코드를 작성했습니다. 그러나 우리는 외부에서 모든 빛을 봉쇄하더라도 베타 방출은 여전히 ​​감지 가능하지만 CCD에 상당한 양의 배경 잡음이 있음을 발견했습니다.
James_pic


15

세 가지 작업을 타이밍하여 하드 드라이브의 응답 시간을 확인하십시오.

  • 자체 소스 읽기
  • 자체 삭제
  • 다시 쓰기

마지막으로 걸리는 시간은 부동으로 채워지고 11 번째 최상위 비트 (가장 가수의 두 번째 최상위 비트)가 사용됩니다.

use Time::HiRes qw(time);

$t1 = time;
open SELF, "<$0";
read SELF, $_, $^H;
close SELF;

unlink $0;

open SELF, ">$0";
print SELF $_;
close SELF;

print 1&unpack(xB3, pack(f, time-$t1))

1
디스크를 삭제하고 디스크에 쓰는 프로그램은 펄이나 파이썬 프로그래머가 할 수있는 일이라고 생각할 수 있습니다. 매우 멋진 아이디어!
iFreilicht

이것은 어떤 하드웨어에도 닿지 않고 VM 내에서 실행될 때 결정적인 것으로 보이며, 이는 매우 일반적인 시나리오입니다.
Peteris

1
캐시 대신 디스크에 의존하도록 디스크를 비우기를 원합니다 (시스템 상태, 규칙 # 2)
MSalters

14

세게 때리다

echo $[`sensors|sed 's/[^1-9]/+/g'`0&1]

sensors 팬 속도와 함께 현재 시스템 온도를 인쇄합니다.

acpitz-virtual-0
Adapter: Virtual device
temp1:        +52.0°C  (crit = +98.0°C)

thinkpad-isa-0000
Adapter: ISA adapter
fan1:        3510 RPM

coretemp-isa-0000
Adapter: ISA adapter
Physical id 0:  +54.0°C  (high = +86.0°C, crit = +100.0°C)
Core 0:         +51.0°C  (high = +86.0°C, crit = +100.0°C)
Core 1:         +46.0°C  (high = +86.0°C, crit = +100.0°C)

sed 's/[^1-9]/+/g'0과 숫자가 아닌 모든 숫자를 더하기 부호로 변환하고 echo $[...0&1]는 결과 합계의 패리티를 인쇄합니다.

dennis의 답변에서 빌린 정규식 및 패리티 계산.


이 답변은 특히 짧은 해결책을 위해 특별한 현상금을 받았습니다 (누군가 궁금해하는 경우를 대비하여). 그것은 내 기준에 의해 Franki의 대답 과 관련이 있었고 추첨으로 이겼습니다.
Wrzlprmft 2014 년

12

세게 때리다

(echo -en "ibase=16;";(find /proc/[0-9]*/s* -type f -maxdepth 2 ; find /sys /proc/[^0-9]* -type f) 2>&1 | xargs -n1 sha256sum  2>&1 | sha256sum | tr abcdef ABCDEF | sed 's/  -/%2/' )| bc

만일을 위해 모든 것을 사용합니다 ...

에 따라

  • 대부분의 하드웨어 센서의 센서 판독 값 (약 어딘가에 /sys또는 값을 노출 /proc)
  • 시스템의 모든 프로세스의 수, 메모리 레이아웃 및 런타임 ( "시스템 상태"로 간주 될 수 있지만 일반적으로 하드웨어 타이밍에 따라 달라짐)
  • 시스템에 따라 다양한 값 /proc/<pid>/s*(예 : sched / schedstat)은 해당 프로세스를 활성화하는 데 필요한 하드웨어 속도에 따라 다릅니다.
  • 내가 생각하지 못했던 것들도 그 파일들에서 사용할 수 있습니다.

내 시스템의 런타임은 ~ 10 초이지만 많이 다를 수 있습니다. 특히 루트로 실행하거나 제외하도록 최소한 수정하십시오 /proc/kcore(여기에 실제로 포함되어있는 엔트로피를 포함하기 위해 많은 시간을 할애하지 않는 한)


9

쉘 + Wi-Fi

sudo airmon-ng start wlan0 > /dev/null && sudo dumpcap -a duration:30 -i mon0 -w out.cap > /dev/null && sha512sum out.cap | grep -c "^[0-7]" && sudo airmon-ng stop mon0 > /dev/null

Wi-Fi 카드를 모니터 모드로 설정하고, 수신 한 30 초 분량의 패킷 (인접 네트워크에서 읽을 수없는 암호화 된 데이터 포함)을 덤프하고 패킷 데이터의 sha512 해시를 취한 후 해시의 첫 문자가 0-7이면 1을 반환합니다. . Wi-Fi 카드가 wlan0이고 현재 mon0장치 가 없다고 가정 합니다.

근처에 Wi-Fi 장치가 없으면 매번 동일하므로 출력을 예측할 수 있습니다.


1
흠, 나는 Wi-Fi 장치의 부재가 너무 부자연 스럽기 때문에 무시할 수는 없습니다.
Wrzlprmft

3
@Wrzlprmft 그것은 당신이 어디에 있는지에 달려 있습니다. 붐비는 도시 지역에 와이파이 네트워크가없는 것은 부자연 스럽습니다. 보편적으로 볼 때, 거의 전체 진공 상태에 있지 않다는 것은 공정한 가정이 아니며 지구에 국한되지 않는 한 컴퓨터가 물에 잠기지 않았다고 가정하는 것도 공정합니다.
Ian D. Scott

1
@ IanD.Scott : 글쎄, 저를위한 다음의 wifi가없는 지역은 실제로 지하실에 있습니다 (내가 왜 이것을 알고 있는지 묻지 마십시오). 그리고 나는 아무데도 중간에 살고 있지 않습니다. 어쨌든, 와이파 이가없는 서라운드의 컴퓨터 수는 물 또는 진공 상태의 (작동중인) 컴퓨터 수를 몇 배 정도 확실히 초과합니다. (모든 것이 결국 자연 에 대한 당신의 정의에
달려

8

인텔에서 제조 한 최신 8086 호환 프로세서에는 쉽게 접근 할 수있는 주변 장치가 포함되어있어 적절한 임의성을 생성합니다. rdrand주변 장치를 사용할 수 없거나 엔트로피가 아닌 경우 임의 비트 패턴을 생성하거나 캐리 플래그를 설정 하는 명령을 사용하여 주변 장치를 구동합니다 .

80386 Linux에 대한 다음 짧은 프로그램은 cpuid명령을 통해 주변 장치를 사용할 수 있는지 확인 하고 난수를 생성하려고 시도합니다. 주변 장치 나 난수를 사용할 수 없으면 프로그램은 상태로 종료됩니다 1. 난수를 생성 할 수 있으면 a 1또는 a 0가 인쇄되고 프로그램은 종료 상태로 종료 0됩니다.

다른 이름으로 저장 rand.s및 조립

as --32 -o rand.o rand.s
ld -melf_i386 -o rand rand.o

전체 어셈블리는 다음과 같습니다.

        .globl _start
        .type _start,@function
_start:
        # check if the cpuid instruction is available by trying to
        # toggle the id flag in the eflags register
        pushfl
        mov (%esp),%eax
        btc $21,%eax    # toggle id bit
        push %eax
        popfl           # check if id bit was saved
        pushfl
        pop %eax        # load new flags
        pop %ecx        # load original flags
        xor %ecx,%eax   # difference is in %eax
        bt $21,%eax     # check if bit was flipped
        jnc .Lfailure

        # if we reach this part, we have a cpuid instruction
        # next, check if rdrand exists
        mov $1,%eax     # load cpuid leaf 1
        cpuid
        bt $30,%ecx     # is rdrnd available?
        jnc .Lfailure

        # let's try to get some random data
        rdrand %ax      # don't waste randomness; one bit would suffice
        jnc .Lfailure   # no randomness available
        and $1,%eax     # isolate one bit of randomness
        add $0x30,%al   # 0x30 = '0'
        push %eax
        mov $4,%eax     # prepare a write system call
        mov $1,%ebx
        mov %esp,%ecx   # where we placed the data before
        mov %ebx,%edx   # one byte
        int $0x80

        # okay, we're done here. Let's exit
        mov %ebx,%eax   # do an exit system call with status 0
        xor %ebx,%ebx
        int $0x80

.Lfailure:
        mov $1,%eax     # do an exit system call with status 1
        mov %eax,%ebx
        int $0x80

        .size _start,.-_start

그리고 결과 77 바이트의 머신 코드 덤프 :

08048098 <_start>:
 8048098:   9c                      pushf  
 8048099:   8b 04 24                mov    (%esp),%eax
 804809c:   0f ba f8 15             btc    $0x15,%eax
 80480a0:   50                      push   %eax
 80480a1:   9d                      popf   
 80480a2:   9c                      pushf  
 80480a3:   58                      pop    %eax
 80480a4:   59                      pop    %ecx
 80480a5:   31 c8                   xor    %ecx,%eax
 80480a7:   0f ba e0 15             bt     $0x15,%eax
 80480ab:   73 2f                   jae    80480dc <_start+0x44>
 80480ad:   b8 01 00 00 00          mov    $0x1,%eax
 80480b2:   0f a2                   cpuid  
 80480b4:   0f ba e1 1e             bt     $0x1e,%ecx
 80480b8:   73 22                   jae    80480dc <_start+0x44>
 80480ba:   66 0f c7 f0             rdrand %ax
 80480be:   73 1c                   jae    80480dc <_start+0x44>
 80480c0:   83 e0 01                and    $0x1,%eax
 80480c3:   04 30                   add    $0x30,%al
 80480c5:   50                      push   %eax
 80480c6:   b8 04 00 00 00          mov    $0x4,%eax
 80480cb:   bb 01 00 00 00          mov    $0x1,%ebx
 80480d0:   89 e1                   mov    %esp,%ecx
 80480d2:   89 da                   mov    %ebx,%edx
 80480d4:   cd 80                   int    $0x80
 80480d6:   89 d8                   mov    %ebx,%eax
 80480d8:   31 db                   xor    %ebx,%ebx
 80480da:   cd 80                   int    $0x80
 80480dc:   b8 01 00 00 00          mov    $0x1,%eax
 80480e1:   89 c3                   mov    %eax,%ebx
 80480e3:   cd 80                   int    $0x80

12
임의의 숫자 생성 용이 아닌 한 […] 하드웨어 […]를 사용할 수 있습니다 .”– 하드웨어 난수 생성기를 사용하지 말고 즉흥적으로 사용 하는 것이 목표입니다 .
Wrzlprmft

18
@Wrzlprmft rdrand는 난수 생성기가 아닙니다. NSA가 사람들의 암호를 엉망으로 만드는 주변 장치입니다.
FUZxxl

1
실제로이 프로그램을 작성하기 전에 그 문장을 보지 못했습니다. 내 잘못이야.
FUZxxl

7

세게 때리다

가장 불필요하게 비싼 난수 수집 방법을 목표로합니다. emacs를 백만 번 생성하는 데 걸리는 시간을 정한 다음 Dennis의 트릭을 사용하여 단일 부울 (제 기계에서 약 7 초 소요)로 걸리는 시간을 설정하십시오.

$[`(time (seq 1000000 | xargs -P1000 emacs  >/dev/null 2>&1)) |& sed 's/[^1-9]/+/g'`0&1]

1
평균화로 편차가 매우 작을 수 있습니다…
Sarge Borsch

7

아두 이노 메가 1280

편집 : 핀에 무언가를 꽂지 않는 강력한 업데이트 버전. 이 아이디어는 ATMega1280이 워치 독 발진기에 별도의 내부 발진기를 사용한다는 사실에 의존합니다. 나는 단순히 플래그를 설정하고 시스템 클럭 (Arduino에서 16MHz 외부 크리스탈 임)을 기반으로 카운터를 가지며 클럭 지터 / 분산이 작업을 수행하는 워치 독 인터럽트를 설정합니다.

#include <avr/interrupt.h>

int time;
volatile bool wdt_ran;

// watchdog interrupt handler
ISR(WDT_vect, ISR_BLOCK)
{
  wdt_ran = true;
}

void setup()  
{
  // setup watchdog interrupt
  cli();
  MCUSR &= ~(1 << WDRF);
  WDTCSR |= (1<<WDCE) | (1<<WDE);
  WDTCSR = (1<<WDIE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0);
  sei();
  // Open serial communications and wait for port to open:
  Serial.begin(57600);
}

void loop()
{
  if(wdt_ran)
  {
    Serial.println(abs(time%2));
    wdt_ran = false;
  }
  ++time;
}

5

자바 스크립트

http://jsfiddle.net/prankol57/9a6s0gmv/

비디오 입력을받습니다.

난수를 계산하는 데 사용한 스크린 샷을 볼 수 있습니다.

var m = (navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia);

var constraints = {
  video: {
    mandatory: {
      maxWidth: 350,
      maxHeight: 350
    }
  },
  audio: false
};

var video = document.querySelector("video"), canvas = document.createElement("canvas");
document.body.appendChild(canvas);
canvas.width = 350;
canvas.height = 350;

function start() {
    m.call(navigator, constraints, function (stream) {
        video.src = window.URL.createObjectURL(stream);
    }, function() {
        alert("An error occured. Did you deny permission?");
    });
}

if (m) {
    start();
} else {
    alert('getUserMedia() is not supported in your browser');
}

function getRandomData() {
    var ctx = canvas.getContext("2d");
    ctx.drawImage(video, 0, 0);
    var data = ctx.getImageData(0, 0, 350, 350).data;
    var total = 0;
    for (var i = 0; i < data.length; ++i) {
        total += data[i];
        total %= 2;
    }
    alert("The random number is " + total);
}

document.querySelector("button").onclick = getRandomData;

1
방금 FF에서 버그를 발견했습니다. "공유 중지"가 웹캠을 켜지 않습니다!
Frank

3

리눅스 쉘

이 디스크에서 레이아웃을 예측할 수없는 자주 업데이트되는 디렉토리의 하드 드라이브 읽기 속도 + 액세스 시간을 측정하십시오.

# Set this to the device node of whatever drive you want to measure
DRIVE_DEVICE=sda
# This must be a path that is
# a) on device "/dev/$DRIVE_PATH"
# b) frequently updated to add additional access time randomization due to
#    less-predictable disk layout due to less-predictable time, amount and
#    ordering uf updates, like logfile directories, maybe cache directories.
FIND_PATH=/var/log
# Better than using 'sync' - sync only the disk that we actually read from
# also sync both internal drive and system buffers
hdparm -f -F "/dev/$DRIVE_DEVICE"
# Note: bash's built-in time command doesn't support formats :/
# Note: the result is only going to be as good as the system's time command,
#       which isn't necessarily equally good on other U*ICes
t=$(command time -f '%e' -- find "$FIND_PATH" -printf '' 2>&1)
echo $((${t#*.}&1))

요구 사항 :

1) read and execute access to every directory under "$FIND_PATH"
2) sending (flush) control commands to a hard drive via a device node.
   Requires root access per default, but can be delegated to a less privileged user
   either by using sudo on this script or by applying
       chgrp 'some_system_group' "$DRIVE_DEVICE" &&
       chmod g+rx "$DRIVE_DEVICE"
   if this is acceptable on your system.

이 접근 방식은 시스템의 데이터를 수정하지 않고 primo의 데이터보다 perl을 요구하지 않는 이점이 있습니다.


3

껍질

Linux에서 테스트되었지만 U * IX에도 / proc / stat가 있습니까?

이것은 하나의 추가 프로세스 만 시작하고 하나의 추가 파일 만 읽습니다 (디스크조차도 아님). 꽤 빠릅니다.

t=1`sum /proc/stat`;echo $[${t% *}&1]

/ proc / stat에는 IO 대기 시간, 하드웨어 인터럽트까지의 시간, 유휴 작업에 소요 된 시간 및 기타 모든 것이 포함되어 있기 때문에 이것은 모든 커널 및 사용자 프로세스 상태에 의해 결정된다고 생각할 수도 있습니다. 외부 하드웨어 입력에 따라 다릅니다.


이 답변은 현상금으로 묶여 있으며 특히 내 기준에 의해 짧은 답변을 받았으며 로트에 의해 손실되었습니다.
Wrzlprmft 2014 년

2

MATLAB

마이크 솔루션 :

recObj=audiorecorder;recordblocking(recObj,10);rem(sum(getaudiodata(recObj)<0),2)

10 초의 사운드를 녹음하고 녹음에서 음수 샘플 수를 찾은 다음이 숫자가 짝수이면 0을 출력하고 홀수이면 1을 출력합니다. 따라서 50 % 확률로 0입니다. 이 방법은 자동 녹음에서 피할 수없는 소량의 소음이라도 랜덤 출력을 생성하기에 충분하다는 것을 의미합니다. 다음과 같이 약간 긴 코드는 더 짧은 기록을 사용하여 더 높은 비트 전송률로 보상하여 더 많은 노이즈를 제공함으로써 숫자 생성기의 속도를 높입니다.

recObj=audiorecorder(8000,16,1);recordblocking(recObj,0.1);rem(sum(getaudiodata(recObj)<0),2)

조용한 조건에서 테스트 한 결과, 후자의 코드가 100 회 실행되면 코드가 0 번 51 번 출력됩니다. 시끄러운 조건에서 100 회 실행하여 0 회 40 회를 생성했습니다.

편집 : 원래 코드의 결함을 지적 한 Emil에게 감사합니다 :-)


1
레코드가 자동이 아니고 샘플이 0이 아닌 경우 어떻게됩니까?
Emil

1
좋은 질문. 값이 0을 중심으로 진동하고 (사운드 진동) 소수의 수가 제한되어 있기 때문에 일부 0은 어쨌든 나타나는 경향이 있습니다. 그러나 이제 언급 했으므로 ~ = 0 대신 "<0"이되어야하므로 대신 음성 샘플의 수를 계산합니다. :-] 이것도 무작위입니다.
Abulafia

0

세게 때리다

(감사합니다, 데니스)

echo $[`w|sed 's/[^1-9]/+/g'`0&1]

1
내가 완전히 실수하지 않은 경우, 이것은 시스템 시간과 컴퓨터의 현재 소프트웨어 상태에만 의존하며 또한 사용자가 로그인해야합니다.
Wrzlprmft

@Wrzlprmft : w로그인 한 사용자 목록을 표시하며 비어있을 수 있습니다. 시스템로드는 CPU 큐 길이를 기준으로합니다.
Dennis

글쎄, 난 대체 할 수 w와 함께 top.
Soham Chowdhury

0

컴퓨터 가속도계의 최하위 비트를 가져옵니다 ( hdapsLinux 모듈 필요 ).

#!/usr/bin/env python
import re
m = re.search('([-\d]+),([-\d]+)',
              open('/sys/devices/platform/hdaps/position', 'r').read())
print((int(m.group(1)) ^ int(m.group(2))) & 1)

이것은 기본적으로 센서의 소음을 측정합니다.


0

스마일 BASIC

XON MOTION 'enable motion sensor
ACCEL OUT ,,Z 'get Z acceleration (up/down)
PRINT Z<-1 'if Z is less than -1, output 1, otherwise 0.

3DS의 모션 센서를 사용합니다. 가속도계의 Z 축은 일반적으로 -1 (중력 때문에) 정도이며 임의의 노이즈로 인해 때때로 위 또는 아래에있을 수 있습니다.

다음은 마이크를 사용하는 것입니다.

XON MIC 'enable microphone
DIM REC%[0] 'make array
MICSTART 0,3,1 'start recording. 0=8180Hz, 3=8 bit unsigned, 1=1 second
WAIT 1 'delay (1 frame is enough since we only check the first sample)
MICSAVE MIC 'save recording
PRINT MIC[0]>0 'if the first sample isn't negative, output 1

-3

세게 때리다

나는 Soham의 제안을 사용했다 top.

echo $[`top -bn1|sed 's/[^1-9]/+/g'`0&1]

편집 : Soham과 같은 방식으로 작동합니다. top 출력에서 ​​숫자가 아닌 모든 문자를 '+'로 바꾸고 결과 문자열의 패리티를 평가합니다.

상단의 'b'플래그는 일괄 처리 모드로 실행되므로 첫 번째 screenful뿐만 아니라 모든 프로세스를보고하고 'n1'은 상단의 1 반복을 실행한다고 말합니다.


귀하와 Soham의 프로그램간에 차이가 있습니까?
clismique
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.