Donanım Rastgele Sayı Üreticisini Geliştirin


53

Göreviniz, etrafta hangi donanıma sahip olursa olsun, bir donanım rasgele sayı üretecini doğaçlama yapmaktır.

Meydan okuma

Aşağıdaki özelliklere sahip bir program yazın:

  1. Ya yazdırır (ya 0da 1başka hiçbir şey yoktur)
  2. Çıktı, yalnızca bilgisayarın iç durumuna değil fiziksel bir işleme bağlıdır.
  3. Sonraki çalışmaların çıktıları arasında bir ilişki yoktur (bir dakika arayla).
  4. Çıktı, herhangi bir gerçekçi çabayla tahmin edilemez.
  5. Çıktının olma olasılığı 00.2 ile 0.8 arasındadır.
  6. Makul bir olasılıkla yüksek olan bir dakikadan az bir sürede çalışır.

Açık değilse, programınızın neden bu özelliklere sahip olduğunu açıklamalısınız.

Açıklamalar ve Kısıtlamalar

Aşağıdakiler bir popülerlik yarışması için çok fazla kısıtlama gibi görünebilir, ancak sonuçta programın sorunun ruhu içinde kalmasını sağlamak, biraz işe yaraması ve tamamen fazladan olmaktan ötürü popüler olan ancak sonuçta fazla olan çözümlerden kaçınması oldukça sıkıcı.

  • Sistem zamanı fiziksel bir işlem olarak sayılmaz.
  • Rasgele-sayı oluşturma için tasarlanmadıkça , 8 inçlik floopy-disk sürücülerden USB roket başlatıcısına ve kulaklıklara kadar istediğiniz herhangi bir tüketici donanımını kullanabilirsiniz . Bir donanım parçası , seri üretildiyse ve 1000 $ / € / £ 'dan az maliyeti varsa , tüketici sınıfıdır, bu nedenle radyo teleskoplarını, CERN, MRI'leri veya ev yapımı parçacık dedektörünü kullanamazsınız.
  • Açma (bir güç anahtarına sahipse) ve donanımın düzgün şekilde kurulup işlevsel hale getirilmesi gibi donanımın durumu ve hizalaması hakkında yalnızca en temel varsayımları yapabilirsiniz. Örneğin, genellikle bir diski okuyabilecek ve sıkışmayacak bir CD sürücüsünün varsayabilir, ancak açık veya kapalı ya da bir disk içerdiğini varsayamazsınız. Başka bir örnekte, özel bir etkileşime izin vermek için iki donanım parçasının hizalandığını varsayamazsınız, ancak aynı odada olduklarını varsayabilirsiniz.
  • Donanımı, bölmediğiniz sürece, istediğiniz herhangi bir durumda bırakabilirsiniz.
  • Donanımın doğal bir ortamda olduğunu varsayabilir ve üstlenmelisiniz, ama daha fazlasını değil. Örneğin, donanımın bir sıvı helyum tankına, son derece ses ve ışık geçirmez bir odaya veya uzaya yerleştirilmediğini varsayabilirsiniz. Ancak, yalnızca radikal çabalarla kaçınılabilecek olanlar dışında, mevcut olan herhangi bir ses ve ışık kaynağını üstlenemezsiniz.
  • Programınız, tercih ettiğiniz ezoterik olmayan bir işletim sistemine sahip standart bir masaüstü bilgisayarda çalışmalıdır. Rasgele sayı üretimi için özel olarak tasarlanmamış herhangi bir yazılımı kullanabilirsiniz.
  • İnternet erişimini üstlenemezsiniz.
  • İnsanların bulunmadığını veya bulunmadığını varsayamazsınız, ancak programınıza kasten kimsenin müdahale etmediğini, örneğin bir vantilatörü el ile durdurarak veya hiçbir şeyi yapmayan bir programı çalıştırarak mikrofonu olabildiğince sık çalıştıracağınızı varsayabilirsiniz.
  • Yazılım ayarlarıyla ilgili yalnızca en temel varsayımları yapabilirsiniz. Örneğin, sürücülerin kurulduğunu ve etkinleştirildiğini varsayabilirsiniz, ancak sesin kesilmesi için hazırlıklı olmalısınız.
  • Yazılım ayarlarını istediğiniz herhangi bir durumda bırakabilirsiniz.

Bonus

Özel bir ödül, özellikle kısa bir çözüme verildi. Bu, talimatların sayısından çok, karakterlerden de farklıydı. Kazananlar (kriterlerime göre bağlandı):

Sadece bir cevap verebildim ve Tejas Kale'nin cevabı çokça kazandı.


2
Yeni akıllı telefonlarda ve dizüstü bilgisayarlarda bulunanlar gibi bir jiroskop tüketici donanımı olarak kabul edilir mi?
Nzall

@ NateKerkhofs: Evet.
Wrzlprmft

Aslında, "tüketici sınıfı donanım" tanımını alabilir miyiz? "Yerel bilgisayar mağazanızdan 500 USD'den daha düşük bir fiyata satın alabileceğiniz veya 1.000 USD'lik bir makinenin parçası olarak alabileceğiniz bir şey" kabul edilebilir bir tanım mıdır?
Nzall


1
Buraya biraz trivia ekleyeyim, Avustralya Ulusal Üniversitesinde çalışan Quantum Mechanics'e dayalı gerçek bir rasgele sayı üreteci var. Bir göz atın: qrng.anu.edu.au/index.php
Alexandre Teles

Yanıtlar:


28

Kabuk

Mikrofon akışından tek bir örnek okur ve gürültüyle baskın olması gereken en az anlamlı bitini yazdırır.

EDIT: Mikrofonun sesini açmak için değiştirildi ... ve diğer her şey!

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

Ya mikrofonu susturursam? Bu mükemmel bir sessizlik olmaz mı?
yeti

3
@yeti: Tabii ki. Ancak, "donanımın açık ve işlevsel" olduğunu varsaymamıza izin veriyor.
İkiz

3
herşeyi açmak, bana bir "sözde rastgele" ikili üretecine oldukça büyük (ve sinir bozucu) bir yan etki. ^^
Olivier Dulac

1
cat /dev/urandom > /dev/dspBilgisayarları ses geçirmez bir odada / oda / kutu / kılıf / alanda olması durumunda , hoparlörleri bazı verilerle beslemeye çalışabilirsiniz .
Ismael Miguel,

Sadece yapmak istediğim şeydi!
shortstheory

26

darbe

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

Tek bir ping'in yanıt zamanından localhost'a entropi toplar.

Tepki süresinin, çıktıda üç kez göründüğünü unutmayın 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

Diğer tüm rakamlar ve sabit ve - daha önemlisi - cevap süresinden bağımsız.

sed 's/[^1-9]/+/g'her sıfırı ve basamağı artı işaretine dönüştürür echo $[...0&1]ve elde edilen toplamın paritesini yazdırır.


1
: Her zaman benim için 1 basar CYGWIN_NT-6.2-WOW64 work 1.7.28(0.271/5/3) 2014-02-09 21:06 i686 Cygwin- pingvardır ne -qya -cburada.
rr-

2
Windows kullanarak pingonaylandı. Şaşırdım.
rr

1
@JamesSnell: O zaman sorun bu. Windows ping'in kesin hassasiyeti yok; her zaman 1 msn bir zaman gösterecektir ...
Dennis

6
Bu, # 2 kısıtlamasını ihlal ediyor gibi görünüyor: Yerel ana bilgisayara ping işlemi tamamen bilgisayarın iç durumuna bağlıdır.
tophyr

2
Söylemesi zor. @Dennis: Dalgalanmanın nereden geldiğini biliyor musunuz?
Wrzlprmft 22:14

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 burada .

HTML5 DeviceMotion API'sını desteklenen cihazlarda (çoğunlukla mobil cihazlarda) kullanır. Elde edilen accelerationnesneyi JSON'a dönüştürür, hashize eder ve geri kalan modulo 2'yi alır.

Kodun çoğu hash işlevidir (lanet olası JavaScript ve toplam standart kütüphanenizin olmaması). Muhtemelen daha kısa olabilir, ama ben iyi bir hash işlevi için emiciyim.


40
Msgstr "Yeni şifre oluşturmak için lütfen cihazı sallayın."
PTwr

21

Python + Web Kamerası

Buradan utanmadan çalınan kodu kullanarak, web kameranızı kullanarak bir görüntü yakalar, verileri toplar ve en az önemli olanı yazdırır.

#!/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
İyi bir karma içinde "en az anlamlı bit" yoktur. Evet, ne demek istediğini biliyorum
gnibbler 22:14

11
@ 11684, aynı sonuçları önlemek için kamerada muhtemelen yeterli termal gürültü vb.
Var

2
Işık biraz değişmeli (dışardaki ışık yukarı / aşağı gidiyor ve elbette bilgisayar muhtemelen "yanıp sönen ışıkları")
Olivier Dulac

7
Bu gevşekçe bir arkadaşımın yaptığı bir şeye dayanıyor. Gerçekten rastgele sayılar üretmek için radyoaktif bozulma kullanmak istiyordu. Bir web kamerasını ve bir duman alarmını söktü, izotopu CCD'nin yanına koydu ve tespit edilen beta emisyonlarının yerlerini / dev / random olarak beslemek için bir kod yazdı. Ancak, tüm ışığı dışardan kapatsak bile, beta emisyonları hala tespit edilebilir olmasına rağmen CCD'de ölçülebilir bir arka plan gürültüsü olduğunu bulduk.
James_pic


15

Perl

Harddrive'ınızın yanıt süresini, üç işlemi zamanlayarak kontrol eder:

  • Kendi kaynağını okumak
  • Kendini silmek
  • Kendini tekrar yazmak

Son olarak, geçen süre bir şamandıra olarak doldurulur ve 11. en önemli bit kullanılır (mantissa'nın ikinci en önemli biti).

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
Diski silen ve kendisini diske yazan bir program, sadece bir perl veya python programcısı yapabileceğini hayal edebileceğim bir şey. Çok güzel bir fikir!
iFreilicht 23:14

Bu, herhangi bir donanıma dokunmayacak ve çok yaygın bir senaryo olan bir VM'de çalışırken belirleyici olmayacak bir şeye benziyor.
Peteris

1
Önbellek yerine diske bağlı olmasını sağlamak için diske
basmak istersiniz

14

darbe

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

sensors mevcut sistem sıcaklıklarını fan hızı ile birlikte yazdırır.

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'her sıfırı ve basamağı artı işaretine dönüştürür ve yankı $[...0&1], elde edilen toplamın eşliğini yazdırır.

Regex ve parite hesaplaması dennis'in cevabından ödünç alındı.


Bu cevaba çok kısa bir çözüm için özel bir ödül verilmiştir (tam da, herkes harikası). Franki'nin cevabına kriterlerime göre bağlandı ve lotla kazandı.
Wrzlprmft

12

darbe

(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

Her şeyi kullanır, sadece durumda ...

Bağlıdır

  • çoğu donanım sensörünün sensör okumaları (yaklaşık olarak değerleri bir yerde /sysveya içinde /proc)
  • sistemdeki tüm işlemlerin sayısı, hafıza düzeni ve çalışma süreleri ("sistemin durumu" olarak kabul edilebilir, ancak genellikle donanımın zamanlamalarına bağlıdır)
  • sisteme bağlı olarak, /proc/<pid>/s*(örn. Çizelgeleme / schedstat) içindeki çeşitli değerler, bu işlemleri canlandırmak için gereken donanım hızına bağlıdır.
  • Bunu düşünmemiş olabileceğim şeyler de bu dosyalarda mevcut.

Sistemimdeki çalışma zamanı ~ 10s, ancak çok farklı olabilir. Özellikle bunu kök olarak çalıştırmayın ya da en azından dışlamak için değiştirmeyin /proc/kcore(orada bulunan entropiyi dahil etmek için çok fazla zaman harcamak istemiyorsanız, ki muhtemelen her şeyi içerecektir)


9

Shell + 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 kartı izleme moduna geçirir, 30 saniye değerinde paket alır (komşu ağlardan okunamayan şifrelenmiş veriler dahil). . Kablosuz kartınızın olduğunu wlan0ve şu anda bir mon0cihazınız olmadığını varsayalım .

Yakınlarda wi-fi cihazı yoksa, çıkış her zaman aynı olacağı için tahmin edilebilir olacaktır.


1
Hımm, wi-fi cihazlarının yokluğunu o kadar doğal ki ihmal edebilecek kadar sayılmaz.
Wrzlprmft 22:14

3
@Wrzlprmft Nerede olduğunuza bağlı. Kalabalık bir kentsel alanda wifi ağlarının olmaması doğal değildir. Evrensel ölçekte, toplam bir vakumda olmamak adil bir varsayım değildir, ya da Dünya ile sınırlıysa, bilgisayarın suya batmadığını varsaymak adil olmaz.
Ian D. Scott

1
@ IanD.Scott: Benim için bir sonraki wifi içermeyen alan aslında mahzende (neden bunu bildiğimi sorma). Ve hiçbir yerin ortasında yaşamıyorum. Her neyse, wifi içermeyen ortamdaki bilgisayarların sayısı kesinlikle sudaki (çalışan) bilgisayarların sayısını ya da bir vakumda birkaç büyüklük sırasını aşıyor. (Sonunda hepsi doğal
olana bağlı

8

Intel tarafından üretilen modern 8086 uyumlu işlemciler, uygun rastgelelik üreten, kolay erişilebilir bir çevre birimi içerir. O periferik Sürüş kullanılarak yapılır rdrandya bir rasgele bit deseni oluşturur veya periferik kullanılamaz veya entropi dışına ise taşıma bayrağını ayarlar talimat.

80386 Linux için aşağıdaki kısa program, çevre birimin cpuidtalimatlarla mevcut olup olmadığını kontrol eder ve rastgele bir sayı oluşturmaya çalışır. Çevresel veya rastgele bir sayı yoksa, program durumu ile sonlandırılır 1. Rastgele bir sayı üretilebiliyorsa, a 1veya a 0yazdırılır ve program çıkış durumuyla sonlandırılır 0.

Olarak kaydet rand.sve montajı yap

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

İşte tüm montaj:

        .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

Ve sonuçta ortaya çıkan 77 baytlık makine kodunun bir dökümü:

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
“Herhangi bir […] donanım […] kullanabilirsiniz - rastgele sayı üretimi için tasarlanmadıysa .” - Amaç, donanım rasgele sayı üretecini doğaçlama , birisini kullanmamaktır.
Wrzlprmft

18
@Wrzlprmft rdrandrasgele bir sayı üreteci değil. NSA'nın insanların kriptografisini karıştırması için yapılmış bir çevre birimi.
FUZxxl

1
Aslında, bu programı yazmadan önce bu cümleyi fark etmedim. Benim hatam.
FUZxxl

7

darbe

En gereksiz yere pahalı rastgele sayı toplama yöntemini hedeflemek. Yumurtlamanın ne kadar zamandır sürdüğü milyonlarca kez acaba, daha sonra tek bir Boole süresine çevirmek için Dennis'in numarasını kullanın (makinemde yaklaşık 7 saniye sürer).

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

1
ortalamada, sapma çok küçük olabilir…
Sarge Borsch

7

Arduino Mega1280

edit: pinlere takılan herhangi bir şeye karşı dayanıklı olan güncellenmiş versiyon. Bu fikir, ATMega1280'in bekçi köpeği osilatörü için ayrı bir dahili osilatör kullanmasına dayanıyor. Ben sadece bir bayrak ayarlayan, sistem saatini temel alan bir sayacı olan (Arduino'da bu 16MHz'lik bir harici kristaldir) ve saatin titremesinin / varyansının çalışmasına izin veren bir bekçi kesmesi kurdum.

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

Video girişi alır.

Rasgele sayıyı hesaplamak için kullanılan ekran görüntüsünü görebilirsiniz.

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'de bir hata buldum, "Paylaşımı durdur" web kamerasını çevirmiyor!
Frank

3

Linux'ta Kabuk

Bu düzende öngörülemeyen bir sabit sürücünün okuma hızını + bu diskteki sık güncellenen bir dizinin erişim süresini ölçün.

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

gerektirir:

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.

Bu yaklaşım, sistemdeki herhangi bir veriyi değiştirmeme ve primo verileri için perl gerektirme avantajına sahiptir.


3

Kabuk

Linux'ta test edilmiştir, ancak belki de U * IX'inizde / proc / stat var mı?

Bu sadece tek bir ek işlem başlatır, sadece tek bir ek dosya okur (diskte bile değil) ve 37 karakter kısa. Aynı zamanda oldukça hızlı.

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

Biri bunun tüm çekirdek ve kullanıcı ülkesi işlem durumları tarafından belirlendiğini düşünebilir, ancak durum böyle değildir, çünkü / proc / stat ayrıca IO-bekleme süresini, sevice donanım kesintilerini, boşta görevde geçirilenleri ve diğerlerini içerir. harici donanım girişine bağlıdır.


Bu cevap, kriterlerime göre çok kısa bir cevap için lütufla bağlandı ve lotlarca kaybedildi.
Wrzlprmft

2

Matlab

Mikrofon çözümü:

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

10 saniyelik ses kaydı yapar, kayıttaki negatif örnek sayısını bulur ve bu sayı eşitse 0, tek ise 1 çıkar. Böylece% 50 olasılıkla 0. Yaklaşım, sessiz bir kayıtta kaçınılmaz olan küçük miktarlardaki seslerin bile rastgele bir çıktı oluşturmak için yeterli olacağı anlamına gelir. Aşağıdaki biraz daha uzun kod, daha yüksek bir bit hızı ile telafi edilen, daha fazla ses veren daha kısa bir kayıt kullanarak sayı üreticisini hızlandırır.

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

Sessiz koşullar altında yapılan bir testte, ikinci kodun 100 çalışmasında kodun 51 kez sıfır verdiğini tespit ediyorum. Gürültülü koşullarda 100 çalışma sıfır 40 kez üretildi.

Düzenleme: Orijinal kodundaki bir hatayı işaret ettiği için Emil'e teşekkürler :-)


1
Kayıt sessiz değilse ve sıfır olmayan örnek yoksa ne olur?
Emil

1
İyi soru. Bazı sıfırlar yine de ortaya çıkma eğilimindedir, çünkü değerler sıfır civarında salınır (ses titreşimleri) ve sınırlı sayıda ondalık vardır. Ama şimdi bahsettiğinize göre, tabii ki ~ = 0 yerine "<0" olmalı, böylece bunun yerine negatif örneklerin sayısını saymalıyım. : -] Bu da rastgele.
Abulafia

0

darbe

(Teşekkürler Dennis.)

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

1
Tamamen yanılmıyorsam, bu yalnızca sistem zamanına ve bilgisayarın mevcut yazılım durumuna dayanır ve dahası, bir kullanıcının oturum
açmasını

@Wrzlprmft: wboş olabilen giriş yapmış kullanıcıların listesini gösterir. Sistem yükü CPU sırası uzunluğuna dayanmaktadır.
Dennis,

Şey wile değiştirebilirim top.
Soham Chowdhury

0

Bilgisayarın akselerometresinin en az önemli kısmını alır ( hdapsLinux modülüne ihtiyaç duyar ):

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

Bu temelde sensörün sesini ölçer.


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.

3DS'nin hareket sensörünü kullanır. Akselerometrenin Z ekseni genellikle -1 civarındadır (yerçekimi nedeniyle) ve rastgele gürültü nedeniyle, bazen bunun üstünde veya altında olabilir.

İşte mikrofonu kullananlardan biri:

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

darbe

Soham'ın kendi önerisini aldım (kullanarak top):

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

Düzenleme: Soham'ın yaptığı gibi çalışır. Top çıktısındaki tüm sayısal olmayan karakterleri '+' değerine dönüştürür ve elde edilen dizenin paritesini değerlendirir.

'b' bayrağı, toplu modunda çalıştırır, böylece yalnızca ilk ekran göstericiyi değil, tüm işlemleri raporlar ve 'n1' sadece 1 yineleme çalıştırdığını söyler.


Sen ve Soham'ın programı arasında gerçekten bir fark var mı?
clismique
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.