Cải thiện trình tạo số ngẫu nhiên phần cứng


53

Nhiệm vụ của bạn là ứng biến một trình tạo số ngẫu nhiên phần cứng với bất kỳ phần cứng nào bạn đang nằm xung quanh.

Thử thách

Viết chương trình với các thuộc tính sau:

  1. Nó in một trong hai 0hoặc 1(và không có gì khác).
  2. Đầu ra phụ thuộc vào một quá trình vật lý chứ không chỉ trạng thái bên trong của máy tính.
  3. Không có mối quan hệ giữa các đầu ra của các lần chạy tiếp theo (cách nhau một phút).
  4. Đầu ra là không thể dự đoán với bất kỳ nỗ lực thực tế.
  5. Xác suất của đầu ra 0là từ 0,2 đến 0,8.
  6. Nó chạy trong chưa đầy một phút với xác suất khá cao.

Bạn phải giải thích tại sao chương trình của bạn có các thuộc tính này, nếu nó không rõ ràng.

Làm rõ và hạn chế

Những điều sau đây có vẻ như có rất nhiều hạn chế đối với một cuộc thi về sự nổi tiếng, nhưng cuối cùng tất cả là để đảm bảo rằng chương trình vẫn nằm trong tinh thần của câu hỏi, phần nào hoạt động và để tránh các giải pháp phổ biến do quá mức cần thiết nhưng hoàn toàn là khá nhàm chán.

  • Thời gian hệ thống không được tính là một quá trình vật lý.
  • Bạn có thể sử dụng bất kỳ phần cứng cấp độ người tiêu dùng nào bạn thích từ ổ đĩa nổi 8 inch cho đến thiết bị phóng tên lửa USB đến tai nghe - trừ khi nó được dùng để tạo số ngẫu nhiên. Một phần cứng thuộc cấp độ người tiêu dùng, nếu nó được sản xuất hàng loạt và có giá dưới 1000 $ / € / £, vì vậy bạn không thể sử dụng kính viễn vọng vô tuyến, CERN, MRI hoặc máy dò hạt chế tạo tại nhà của bạn.
  • Bạn chỉ có thể đưa ra các giả định cơ bản nhất về trạng thái và căn chỉnh của phần cứng như được bật (nếu nó có công tắc nguồn) và được cài đặt đúng chức năng. Ví dụ, bạn có thể giả sử ổ đĩa CD thường có khả năng đọc đĩa và không bị kẹt, nhưng bạn không thể cho rằng nó là mở hoặc đóng hoặc để chứa đĩa. Trong một ví dụ khác, bạn không thể giả sử hai phần cứng được căn chỉnh để cho phép tương tác đặc biệt, nhưng bạn có thể cho rằng chúng ở trong cùng một phòng.
  • Bạn có thể để phần cứng ở bất kỳ trạng thái nào bạn thích, trừ khi bạn phá vỡ nó.
  • Bạn có thể và phải cho rằng phần cứng ở trong môi trường tự nhiên, nhưng không có gì hơn thế. Ví dụ, bạn có thể giả định rằng phần cứng không được đặt trong một bể chứa khí heli lỏng cũng như trong một căn phòng cực kỳ cách âm và sáng cũng như trong không gian. Tuy nhiên, bạn không thể cho rằng bất kỳ nguồn âm thanh và ánh sáng nào có mặt ngoại trừ những nguồn chỉ có thể tránh được với những nỗ lực triệt để.
  • Chương trình của bạn phải chạy trên một máy tính để bàn tiêu chuẩn với hệ điều hành không bí truyền mà bạn chọn. Bạn có thể sử dụng bất kỳ phần mềm nào không được thiết kế riêng để tạo số ngẫu nhiên.
  • Bạn không thể giả sử truy cập Internet.
  • Bạn không thể cho rằng con người có mặt cũng không vắng mặt, nhưng bạn có thể cho rằng không ai cố tình can thiệp vào chương trình của bạn, ví dụ, bằng cách dừng quạt thủ công hoặc chạy chương trình không làm gì ngoài việc tắt micrô thường xuyên nhất có thể.
  • Bạn chỉ có thể đưa ra các giả định cơ bản nhất về cài đặt phần mềm. Ví dụ: bạn có thể giả sử trình điều khiển được cài đặt và kích hoạt nhưng bạn phải chuẩn bị cho âm thanh bị tắt.
  • Bạn có thể để các cài đặt phần mềm ở bất kỳ trạng thái nào bạn muốn.

Thêm

Một tiền thưởng đặc biệt đã được trao cho một giải pháp đặc biệt ngắn. Điều này đúng hơn là theo số lượng hướng dẫn và tương tự như bằng ký tự. Những người chiến thắng là (gắn theo tiêu chí của tôi):

Tôi chỉ có thể trao một câu trả lời và câu trả lời của Tejas Kale đã giành được rất nhiều.


2
Là một con quay hồi chuyển như những gì được tìm thấy trong điện thoại thông minh và máy tính xách tay mới hơn được coi là phần cứng tiêu dùng?
Nzall

@NateKerkhofs: Vâng.
Wrzlprmft

Trên thực tế, chúng ta có thể có được một định nghĩa về "phần cứng cấp độ người tiêu dùng" không? Là "bất cứ thứ gì bạn có thể mua tại cửa hàng máy tính địa phương của bạn với giá dưới 500 USD, hoặc bạn có thể nhận được như một phần của máy 1.000 USD" là một định nghĩa có thể chấp nhận được?
Nzall


1
Hãy để tôi chèn một số câu đố nhỏ ở đây, có một trình tạo số ngẫu nhiên thực sự dựa trên Cơ học lượng tử đang chạy tại Đại học Quốc gia Úc. Hãy xem: qrng.anu.edu.au/index.php
Alexandre

Câu trả lời:


28

Vỏ

Đọc một mẫu duy nhất từ ​​luồng micrô và in bit có ý nghĩa nhỏ nhất của nó, nên bị chi phối bởi tiếng ồn.

EDIT: Thay đổi để bật micrô ... và mọi thứ khác nữa!

# 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 ))

Nếu tôi tắt mic thì sao? Đây có phải là sự im lặng hoàn hảo?
yeti

3
@yeti: Vâng, chắc chắn rồi. Nhưng chúng tôi được phép giả định rằng "phần cứng được bật và hoạt động", mà tôi nghĩ bao gồm điều đó.
Ell

3
đối với tất cả mọi thứ là một tác dụng phụ khá lớn (và gây phiền nhiễu) cho trình tạo nhị phân "giả ngẫu nhiên", với tôi ^^
Olivier Dulac

1
Bạn có thể thử cung cấp cho loa một số dữ liệu bằng cách sử dụng cat /dev/urandom > /dev/dsp, trong trường hợp máy tính ở trong phòng cách âm / buồng / hộp / thùng / không gian cách âm.
Ismael Miguel

chỉ là những gì tôi muốn làm!
shortstheory

26

Bash

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

Tập hợp entropy từ thời gian phản hồi của một ping đến localhost.

Lưu ý rằng thời gian phản hồi xuất hiện chính xác ba lần trong đầu ra của 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

Tất cả các số khác và không đổi và - quan trọng hơn - độc lập với thời gian đáp ứng.

sed 's/[^1-9]/+/g'chuyển đổi mọi số 0 và không chữ số thành dấu cộng và echo $[...0&1]in tính chẵn lẻ của tổng kết quả.


1
Nó luôn in 1 cho tôi: CYGWIN_NT-6.2-WOW64 work 1.7.28(0.271/5/3) 2014-02-09 21:06 i686 Cygwin- pingkhông có -qhoặc -cở đây.
rr-

2
Sử dụng Windows pingxác nhận. Tôi ngạc nhiên.
rr-

1
@JamesSnell: Đó là vấn đề rồi. Windows ping không có đủ độ chính xác; nó sẽ luôn hiển thị thời gian là 1 ms ...
Dennis

6
Có vẻ như điều này vi phạm hạn chế # 2: Ping Ping localhost hoàn toàn phụ thuộc vào trạng thái bên trong của máy tính.
tophyr

2
Thật khó để nói. @Dennis: Bạn có biết biến động đến từ đâu không?
Wrzlprmft

25

JavaScript + 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 ở đây .

Sử dụng API DeviceMotion HTML5 trên các thiết bị được hỗ trợ (chủ yếu là thiết bị di động). Nó biến accelerationđối tượng kết quả thành JSON, băm nó và lấy modulo 2 còn lại.

Hầu hết các mã là hàm băm (chết tiệt JavaScript của bạn và bạn hoàn toàn thiếu một thư viện chuẩn). Nó có thể ngắn hơn, nhưng tôi là một kẻ hút cho một hàm băm tốt.


40
"Hãy lắc thiết bị để tạo mật khẩu mới."
PTwr

21

Python + webcam

Sử dụng mã bị đánh cắp một cách đáng xấu hổ từ đây , chụp ảnh bằng webcam của bạn, băm dữ liệu và in ra bit ít quan trọng nhất.

#!/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
Không có "bit đáng kể nhất" trong hàm băm tốt. Vâng tôi biết ý của bạn là gì
gnibbler

11
@ 11684, có lẽ có đủ nhiễu nhiệt, v.v. trong máy ảnh để ngăn kết quả giống hệt nhau
gnibbler

2
Ánh sáng sẽ dao động khá nhiều (ánh sáng bên ngoài tăng / giảm và tất nhiên là bất kỳ "đèn nháy" nào mà máy tính có thể phát ra)
Olivier Dulac

7
Điều này dựa trên một cái gì đó mà một người bạn của tôi đã làm. Ông quan tâm đến việc sử dụng phân rã phóng xạ để tạo ra những con số thực sự ngẫu nhiên. Anh ta tháo dỡ một webcam và một thiết bị báo khói, đặt đồng vị bên cạnh CCD và viết một số mã để đưa các vị trí phát thải beta được phát hiện vào / dev / ngẫu nhiên. Tuy nhiên, chúng tôi thấy rằng ngay cả khi chúng tôi đã tắt tất cả ánh sáng từ bên ngoài, vẫn có một lượng nhiễu nền có thể đo được trên CCD, mặc dù lượng phát thải beta vẫn có thể phát hiện được.
James_pic


15

Perl

Kiểm tra thời gian phản hồi của Harddrive của bạn, bằng cách định thời gian cho ba thao tác:

  • Đọc nguồn riêng của nó
  • Xóa chính nó
  • Tự viết lại

Cuối cùng, thời gian thực hiện được đóng gói như một chiếc phao và bit đáng kể thứ 11 được sử dụng (bit đáng kể thứ hai của lớp phủ).

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
Một chương trình xóa và ghi chính nó vào đĩa là điều mà tôi chỉ có thể tưởng tượng ra một lập trình viên perl hoặc python để làm. Ý tưởng rất tuyệt!
iFreilicht

Cái này trông có vẻ không chạm vào bất kỳ phần cứng nào và có tính xác định khi chạy trong VM, đây là một tình huống rất phổ biến.
Peteris

1
Bạn muốn tuôn ra đĩa để làm cho nó phụ thuộc vào đĩa thay vì bộ đệm (đó là trạng thái máy, quy tắc số 2)
MSalters

14

Bash

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

sensors in nhiệt độ hệ thống hiện tại cùng với tốc độ quạt.

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'chuyển đổi mọi số 0 và không chữ số thành dấu cộng và echo $[...0&1]in tính chẵn lẻ của tổng kết quả.

Tính toán chính quy và tương đương mượn từ câu trả lời của dennis.


Câu trả lời này đã được trao một tiền thưởng đặc biệt cho một giải pháp đặc biệt ngắn (chỉ trong trường hợp, bất kỳ ai thắc mắc). Nó được gắn với câu trả lời của Frank theo tiêu chí của tôi và đã giành được rất nhiều.
Wrzlprmft

12

Bash

(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

Sử dụng mọi thứ, chỉ trong trường hợp ...

Phụ thuộc

  • đọc cảm biến của hầu hết các cảm biến phần cứng (về tất cả bằng cách nào đó phơi bày giá trị của chúng ở đâu đó trong /syshoặc /proc)
  • số lượng, bố trí bộ nhớ và thời gian chạy của tất cả các quy trình trên hệ thống (có thể được coi là "trạng thái của hệ thống" nhưng thông thường chúng phụ thuộc vào thời gian của phần cứng)
  • tùy thuộc vào hệ thống, các giá trị khác nhau trong /proc/<pid>/s*(ví dụ: lịch trình / lịch trình) phụ thuộc vào tốc độ của phần cứng cần thiết để mang lại các quy trình đó.
  • những điều tôi có thể không nghĩ rằng cũng có sẵn trong các tập tin đó.

Thời gian chạy trên hệ thống của tôi là ~ 10 giây, nhưng có thể thay đổi rất nhiều. Đặc biệt không chạy cái này với quyền root, hoặc ít nhất là sửa đổi nó để loại trừ /proc/kcore(trừ khi bạn sẵn sàng dành nhiều thời gian để đưa vào entropy có trong đó, có lẽ sẽ thực sự bao gồm mọi thứ)


9

Vỏ + 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

Đưa thẻ wi-fi vào chế độ màn hình, bỏ các gói tin nhận được trong 30 giây (bao gồm cả dữ liệu được mã hóa không thể đọc được từ các mạng lân cận), lấy băm sha512 của dữ liệu gói và trả về 1 nếu chữ cái đầu tiên của hàm băm là 0-7 . Giả sử rằng thẻ wi-fi của bạn là wlan0và hiện tại bạn không có mon0thiết bị.

Nếu không có thiết bị wi-fi gần đó, thì đầu ra sẽ được dự đoán trước, vì nó sẽ giống nhau mọi lúc.


1
Hmm, tôi sẽ không tính sự vắng mặt của các thiết bị wi-fi không tự nhiên đến mức bạn có thể bỏ qua nó.
Wrzlprmft

3
@Wrzlprmft Nó phụ thuộc vào bạn đang ở đâu. Thật không tự nhiên khi không có mạng wifi trong một khu đô thị đông đúc. Ở quy mô phổ quát, không ở trong môi trường gần hoàn toàn không phải là một giả định công bằng, cũng như nếu giới hạn ở Trái đất thì công bằng khi cho rằng máy tính không bị chìm trong nước.
Ian D. Scott

1
@ IanD.Scott: Chà, khu vực không có wifi tiếp theo đối với tôi thực sự nằm trong hầm (đừng hỏi tôi tại sao tôi biết điều này). Và tôi không sống giữa hư không. Dù sao, số lượng máy tính trong các phụ kiện không có wifi chắc chắn vượt quá số lượng máy tính (đang hoạt động) trong nước hoặc chân không bằng một số đơn đặt hàng cường độ. ( Tôi đoán tất cả là do định nghĩa tự nhiên của bạn cuối cùng, tôi đoán vậy.)
Wrzlprmft

8

Các bộ xử lý tương thích 8086 hiện đại do Intel sản xuất có chứa một thiết bị ngoại vi có thể truy cập dễ dàng tạo ra sự ngẫu nhiên thích hợp. Điều khiển thiết bị ngoại vi đó được thực hiện bằng cách sử dụng rdrandhướng dẫn tạo ra mẫu bit ngẫu nhiên hoặc đặt cờ mang nếu thiết bị ngoại vi không có sẵn hoặc không có entropy.

Chương trình ngắn sau đây cho 80386 Linux kiểm tra xem thiết bị ngoại vi có sẵn theo cpuidhướng dẫn hay không và cố gắng tạo một số ngẫu nhiên. Nếu không có số ngoại vi hoặc số ngẫu nhiên, chương trình sẽ kết thúc với trạng thái là 1. Nếu một số ngẫu nhiên có thể được tạo ra, một 1hoặc một 0được in ra và chương trình kết thúc với trạng thái thoát 0.

Lưu dưới dạng rand.svà lắp ráp với

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

Đây là toàn bộ lắp ráp:

        .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

Và kết xuất 77 byte mã máy:

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
Bạn có thể sử dụng bất kỳ phần cứng [V]] [ trừ ] - trừ khi nó được dùng cho việc tạo số ngẫu nhiên . Tập - Mục tiêu là để ứng biến một trình tạo số ngẫu nhiên phần cứng, không sử dụng một.
Wrzlprmft

18
@Wrzlprmft rdrandkhông phải là trình tạo số ngẫu nhiên. Đó là một thiết bị ngoại vi được tạo ra để NSA gây rối với mật mã của mọi người.
FUZxxl

1
Thật ra, tôi đã không chú ý đến câu đó trước khi viết chương trình này. Lỗi của tôi.
FUZxxl

7

bash

Nhằm mục đích cho phương pháp thu thập số ngẫu nhiên đắt tiền không cần thiết nhất. Thời gian cần thiết để sinh ra một triệu lần, sau đó sử dụng thủ thuật của Dennis để biến thời gian thực hiện thành một Boolean duy nhất (mất khoảng 7 giây trên máy của tôi).

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

1
với mức trung bình, độ lệch có thể rất nhỏ
Sange Borsch

7

Arduino Mega1280

chỉnh sửa: phiên bản cập nhật mạnh mẽ chống lại bất cứ thứ gì cắm vào chân. Ý tưởng dựa trên thực tế rằng ATMega1280 sử dụng bộ tạo dao động nội bộ riêng cho bộ tạo dao động theo dõi. Tôi chỉ đơn giản là thiết lập ngắt watchdog để đặt cờ, có bộ đếm dựa trên đồng hồ hệ thống (trên Arduino đây là tinh thể ngoài 16 MHz) và cho phép jitter / variance đồng hồ thực hiện công việc.

#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

Javascript

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

Đưa đầu vào video.

Bạn có thể xem ảnh chụp màn hình mà nó dùng để tính số ngẫu nhiên.

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
Tôi vừa tìm thấy một lỗi trong FF, "Dừng chia sẻ" không bật webcam!
Frank

3

Shell trên Linux

Đo tốc độ đọc của ổ cứng + thời gian truy cập của thư mục được cập nhật thường xuyên trên đĩa này mà bố cục không thể đoán trước.

# 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))

đòi hỏi:

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.

Cách tiếp cận này có ưu điểm là không sửa đổi bất kỳ dữ liệu nào trên hệ thống và không yêu cầu perl so với dữ liệu gốc.


3

Vỏ

Đã thử nghiệm trên Linux, nhưng có lẽ U * IX của bạn cũng có / Proc / stat không?

Điều này chỉ bắt đầu một quá trình bổ sung duy nhất, chỉ đọc một tệp bổ sung duy nhất (thậm chí không có trên đĩa) và ngắn 37 ký tự. Nó cũng khá nhanh.

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

Mọi người có thể nghĩ rằng điều này được xác định bởi tất cả các trạng thái tiến trình của kernel và userland, nhưng thực tế không phải vậy, vì / Proc / stat cũng bao gồm thời gian chờ IO, thời gian để dịch vụ gián đoạn phần cứng, thời gian dành cho nhiệm vụ nhàn rỗi và một số khác phụ thuộc vào đầu vào phần cứng bên ngoài.


Câu trả lời này được gắn cho tiền thưởng cho một câu trả lời đặc biệt ngắn theo tiêu chí của tôi và bị mất rất nhiều.
Wrzlprmft

2

Matlab

Giải pháp micro:

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

Ghi lại 10 giây âm thanh, tìm số lượng mẫu âm trong bản ghi và xuất ra 0 nếu số này là số chẵn và 1 nếu là số lẻ. Do đó 0 với xác suất 50%. Cách tiếp cận có nghĩa là ngay cả một lượng nhỏ tiếng ồn, không thể tránh khỏi trong một bản ghi âm, sẽ đủ để tạo ra một đầu ra ngẫu nhiên. Đoạn mã dài hơn một chút sẽ tăng tốc trình tạo số bằng cách sử dụng bản ghi ngắn hơn, được bù với tốc độ bit cao hơn, tạo ra nhiều tiếng ồn hơn.

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

Trong một thử nghiệm trong điều kiện yên tĩnh, tôi thấy rằng trong 100 lần chạy mã sau, mã này cho ra không 51 lần. 100 chạy trong điều kiện ồn ào sản xuất 40 lần.

Chỉnh sửa: Cảm ơn Emil đã chỉ ra một lỗ hổng trong mã gốc :-)


1
Điều gì xảy ra nếu bản ghi không im lặng và không có mẫu nào khác không?
Emil

1
Câu hỏi hay. Một số số không có xu hướng bật lên vì các giá trị dao động quanh 0 (dao động âm thanh) và có số lượng thập phân giới hạn. Nhưng bây giờ khi bạn đề cập đến nó, tất nhiên nó phải là "<0" thay vì ~ = 0, để tôi đếm số lượng mẫu âm thay thế. : -] Điều này cũng là ngẫu nhiên.
Abulafia

0

Bash

(Cảm ơn, Dennis.)

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

1
Nếu tôi không hoàn toàn nhầm, điều này chỉ phụ thuộc vào thời gian hệ thống và trạng thái phần mềm hiện tại của máy tính và hơn nữa yêu cầu người dùng phải đăng nhập.
Wrzlprmft

@Wrzlprmft: whiển thị danh sách người dùng đã đăng nhập, có thể trống. Tải hệ thống dựa trên chiều dài hàng đợi CPU.
Dennis

Vâng, tôi có thể thay thế wbằng top.
Soham Chowdhury

0

Mất một chút đáng kể của gia tốc kế của máy tính (cần hdapsmô-đun Linux):

#!/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)

Điều này về cơ bản đo tiếng ồn của cảm biến.


0

SmileBASIC

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.

Sử dụng cảm biến chuyển động của 3DS. Trục Z của gia tốc kế thường ở khoảng -1 (do trọng lực) và do nhiễu ngẫu nhiên, đôi khi nó có thể ở trên hoặc dưới mức đó.

Đây là một trong đó sử dụng micro:

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

Bash

Tôi lấy gợi ý riêng của Soham (sử dụng top):

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

Chỉnh sửa: Nó hoạt động giống như cách của Soham. Nó biến tất cả các ký tự không phải số trong đầu ra của đỉnh thành '+' và sau đó làm mất tính chẵn lẻ của chuỗi kết quả.

cờ 'b' trên cùng chạy nó ở chế độ hàng loạt để nó báo cáo tất cả các quy trình, không chỉ là màn hình đầu tiên và 'n1' nói rằng chỉ chạy 1 lần lặp trên cùng.


Có thực sự có sự khác biệt nào giữa chương trình của bạn và Soham không?
clismique
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.