Удосконалити апаратний генератор випадкових чисел


53

Ваше завдання - імпровізувати апаратний генератор випадкових чисел з будь-яким обладнанням, де ви лежите.

Виклик

Напишіть програму з такими властивостями:

  1. Він друкує 0або 1(або більше нічого).
  2. Вихід залежить від фізичного процесу, а не лише від внутрішнього стану комп'ютера.
  3. Немає зв'язку між результатами наступних прогонів (одна хвилина один від одного).
  4. Вихід не передбачуваний при будь-яких реалістичних зусиллях.
  5. Ймовірність того, що вихід буде 0знаходитися в межах від 0,2 до 0,8.
  6. Він проходить менше ніж за хвилину з досить високою ймовірністю.

Ви повинні пояснити, чому ваша програма має ці властивості, якщо це не очевидно.

Роз'яснення та обмеження

Наведене може здатися надзвичайно багато обмежень для конкурсу на популярність, але в кінцевому підсумку це все для того, щоб програма залишалася в дусі питання, дещо спрацьовувала та уникала рішень, які користуються популярністю через тотальний надмір, але є в кінцевому рахунку досить нудно.

  • Час системи не вважається фізичним процесом.
  • Ви можете використовувати будь-яке споживаче обладнання, яке вам подобається, від 8-дюймових дисководів з дисководним дискетом до USB-ракетної установки до навушників - якщо тільки воно не призначене для генерації випадкових чисел. Частина обладнання є споживчим рівнем, якщо вона серійно виробляється і коштує менше 1000 $ / € / £, тому ви не можете використовувати радіотелескопи, ЦЕРН, МРТ або свій домашній детектор частинок.
  • Ви можете робити лише основні припущення щодо стану та вирівнювання обладнання, наприклад, увімкнення (якщо воно має вимикач живлення) та належне встановлення та функціонування. Наприклад, ви можете припустити, що привід CD-дисків, як правило, здатний читати диск і не застрявати, але ви не можете припустити, що він відкритий або закритий або містить диск. В іншому прикладі ви не можете припустити вирівнювання двох елементів обладнання, щоб дозволити спеціальну взаємодію, але ви можете припустити, що вони знаходяться в одній кімнаті.
  • Ви можете залишити обладнання в будь-якому зручному вам стані, якщо тільки ви не порушите його.
  • Можна і потрібно вважати, що обладнання знаходиться в природному середовищі, але нічого більше. Наприклад, ви можете припустити, що обладнання не розташоване в баку з рідким гелієм, ні в надзвичайно звуко- і світлонепроникному приміщенні, ні в просторі. Однак ви не можете припускати, що присутні будь-які джерела звуку та світла, крім тих, яких можна уникнути лише радикальними зусиллями.
  • Ваша програма повинна працювати на стандартному настільному комп’ютері з неезотеричною операційною системою на ваш вибір. Ви можете використовувати будь-яке програмне забезпечення, яке не розроблено спеціально для генерації випадкових чисел.
  • Ви не можете припустити доступ до Інтернету.
  • Ви не можете припускати, що люди ні присутні, ні відсутні, але ви можете припустити, що ніхто навмисно не втручається у вашу програму, наприклад, вручну зупиняючи вентилятор або запускаючи програму, яка не робить нічого, окрім якнайчастіше вимикаючи мікрофон.
  • Ви можете зробити лише основні припущення щодо налаштувань програмного забезпечення. Наприклад, ви можете припустити, що драйвери будуть встановлені та активовані, але ви повинні бути готові до вимкнення звуку.
  • Ви можете залишити налаштування програмного забезпечення в будь-якому зручному вам стані.

Бонус

Особливо коротке рішення було нагороджено особливою нагородою. Це було скоріше за кількістю інструкцій і подібним, ніж за символами. Переможці були (прив'язані за моїми критеріями):

Я міг нагородити лише одну відповідь, і відповідь Техаса Кале виграла жеребкуванням.


2
Чи вважається гіроскоп, подібний до тих, що зустрічаються в новіших смартфонах та ноутбуках, споживчим обладнанням?
Nzall

@NateKerkhofs: Так.
Wrzlprmft

Насправді ми могли б отримати визначення поняття "споживче обладнання"? Чи "що-небудь, що ви можете придбати у вашому місцевому магазині комп'ютерів за менше 500 доларів, або що ви можете отримати у складі машини на 1000 доларів", є прийнятним визначенням?
Nzall


1
Дозвольте мені вставити тут невеликі дрібниці, є справжній генератор випадкових чисел на основі квантової механіки, який працює в Австралійському національному університеті. Подивіться: qrng.anu.edu.au/index.php
Александр Телес

Відповіді:


28

Оболонка

Зачитує єдиний зразок із потоку мікрофона та друкує його найменш значущий біт, у якому має домінувати шум.

EDIT: Змінено, щоб увімкнути мікрофон ... та все інше теж!

# 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
відключення всього цього є досить великим (і дратівливим) побічним ефектом для двійкового генератора "псевдовипадкових", для мене ^^
Олів'є Дулак,

1
Ви можете спробувати підсилити колонки деякими даними, використовуючи cat /dev/urandom > /dev/dspлише на випадок, якщо комп'ютер знаходиться у звуконепроникній кімнаті / камері / коробці / корпусі / просторі.
Ісмаель Мігель

просто те, що я хотів зробити!
shortstheory

26

Баш

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

Збирає ентропію від часу відгуку одного пінгу до localhost.

Зауважте, що час відповіді відображається рівно тричі на виході 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'перетворює кожен нуль і нецифрові знаки в знаки плюс і echo $[...0&1]друкує паритет отриманої суми.


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 ping недостатньо точності; він завжди показуватиме час 1 мс ...
Денніс

6
Схоже, це порушує обмеження №2: Pinging localhost повністю залежить від внутрішнього стану комп'ютера.
тофір

2
Складно сказати. @Dennis: А ти знаєш, звідки відбувається коливання?
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 тут .

Використовує API HTML5 DeviceMotion на підтримуваних пристроях (переважно мобільних пристроях). Він перетворює отриманий accelerationоб'єкт у JSON, хеширує його та приймає залишок за модулем 2.

Більшість коду - це хеш-функція (чорт забираєш JavaScript, і твій повний брак стандартної бібліотеки). Можливо, це може бути і коротше, але я присоска для гарної хеш-функції.


40
"Будь ласка, струсіть пристрій, щоб створити новий пароль."
PTwr

21

Python + веб-камера

Використовуючи код безсоромно викрадений звідси , робить знімок за допомогою веб-камери, хеширує дані та друкує найменш значущий біт.

#!/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
У хорошому хеші немає "найменш значущого шматочка". Так, я знаю, що ви мали на увазі
гніблер

11
@ 11684, напевно, у камері достатньо теплового шуму тощо, щоб запобігти однакові результати
gnibbler

2
Світло має коливатися зовсім небагато (зовнішнє світло йде вгору / вниз, і, звичайно, будь-які "миготіння", які комп'ютер, мабуть, випромінює)
Олів'є Дулак,

7
Це грунтується на тому, що робив мій друг. Йому було цікаво використовувати радіоактивний розпад для генерування справді випадкових чисел. Він демонтував веб-камеру та димову сигналізацію, поставив ізотоп поруч із ПЗЗ та написав якийсь код, щоб подати місця виявлених бета-викидів у / dev / random. Однак ми виявили, що навіть якщо ми закривали все світло ззовні, на ПЗЗ спостерігався мірний рівень фонового шуму, хоча бета-викиди все-таки були помітні.
James_pic


15

Perl

Перевіряє час відгуку вашого Harddrive, призначаючи три операції:

  • Читання власного джерела
  • Видаляючи себе
  • Написав себе знову

Нарешті, витрачений час запаковується як поплавок, і використовується 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
Програма, яка видаляє та записує себе на диск, - це те, що я міг собі лише уявити програмістом Perl або python. Дуже класна ідея!
iFreilicht

Це виглядає чимось, що не торкнеться жодного обладнання та не буде детермінованим під час роботи в межах VM, що є дуже поширеним сценарієм.
Петріс

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&1]друкує паритет отриманої суми.

Регекс і розрахунок паритету, запозичені з відповіді денніса


Ця відповідь отримала особливу нагороду за особливо коротке рішення (про всяк випадок, коли хтось цікавиться). Це було пов'язано з відповіддю Франкі за моїми критеріями та виграно жеребкуванням.
Wrzlprmft

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

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 карту в режим монітору, скидає отримані пакети на 30 секунд (включаючи нечитабельні зашифровані дані з сусідніх мереж), бере ша512 хеш даних пакетних даних і повертає 1, якщо перша літера хеша 0-7 . Передбачає, що ваша wi-fi карта є wlan0, і ви зараз не маєте mon0пристрою.

Якщо поблизу немає Wi-Fi пристроїв, то вихід буде передбачуваним, оскільки він буде кожен раз однаковий.


1
Гм, я б не вважав відсутність Wi-Fi пристроїв настільки неприродним, що можна нехтувати цим.
Wrzlprmft

3
@Wrzlprmft Це залежить від того, де ти знаходишся. Неприродно не мати мереж Wi-Fi у переповненому міському районі. У універсальному масштабі відсутність майже повного вакууму не є справедливим припущенням і не обмежується Землею, якщо припустити, що комп'ютер не занурений у воду.
Ян Д. Скотт

1
@ IanD.Scott: Ну, наступна зона без wifi для мене насправді знаходиться в льоху (не питайте мене, чому я це знаю). І я не живу посеред нікуди. Так чи інакше, кількість комп’ютерів, що не містять бездротових мереж, безумовно перевищує кількість (працюючих) комп’ютерів у воді чи вакуумі на кілька порядків. (Мабуть, все зводиться до вашого визначення природного )
Wrzlprmft

8

Сучасні 8086 сумісні процесори виробництва Intel містять легкодоступну периферійну мережу, яка створює належну випадковість. Управління цим периферійним пристроєм виконується за допомогою rdrandінструкції, яка або генерує випадковий бітовий візерунок, або встановлює прапор перенесення, якщо периферійний апарат недоступний або не є ентропією.

Наступна коротка програма для 80386 Linux перевіряє, чи доступний периферійний апарат за допомогою cpuidінструкції та намагається генерувати випадкове число. Якщо периферійне чи випадкове число недоступне, програма припиняється зі статусом 1. Якщо можливо генерувати випадкове число, виводиться 1або а, 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не є генератором випадкових чисел. Це периферія, зроблена для НСА возитися з криптографією людей.
FUZxxl

1
Власне, я не помітив цього речення, перш ніж писати цю програму. Моє ліжко.
FUZxxl

7

баш

Прагнення до найбільш зайвого дорогого методу збору випадкових чисел. Час, скільки потрібно на нерест мільйонів разів, потім використовуйте хитрість Денніса, щоб перетворити час, знятий в єдиний булевий (на моїй машині займає близько 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 це зовнішній кристал 16 МГц), і дозволяю тремтінню / дисперсії годин виконувати роботу.

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

Знімає відео вхід.

Ви можете побачити скріншот, який він використовував для обчислення випадкового числа.

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, "Зупинити спільний доступ" не перетворюється на веб-камеру!
Френк

3

Shell на Linux

Виміряйте швидкість читання жорсткого диска + час доступу до часто оновлюваного каталогу на цьому диску, макет якого непередбачуваний.

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

Цей підхід має перевагу в тому, що не змінювати жодних даних у системі та не вимагати perl над типом primo.


3

Оболонка

Тестовано на Linux, але, можливо, ваш U * IX має / proc / stat також?

Це запускає лише один додатковий процес, зчитує лише один додатковий файл (навіть не на диску) і не вистачає 37 символів. Це також досить швидко.

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

Можна подумати, що це визначається всіма процесами ядра та користувальницької області, але це не так, оскільки / proc / stat також включає час очікування вводу-виводу, час виправлення апаратних переривань, час, витрачений у режимі очікування та деякі інші, які всі залежать від зовнішнього обладнання.


Ця відповідь була прив’язана до винагороди за особливо коротку відповідь за моїми критеріями та втрачена жеребкуванням.
Wrzlprmft

2

Матлаб

Рішення мікрофона:

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

Записує 10 секунд звуку, знаходить кількість негативних зразків у записі та виводить 0, якщо це число парне і 1, якщо непарне. Таким чином, 0 з 50% вірогідністю. Підхід означає, що навіть невеликої кількості шуму, неминучого при безшумному записі, буде достатньо для отримання випадкового виводу. Наступний трохи довший код прискорює генератор чисел, використовуючи коротший запис, компенсований більш високим бітрейтом, що видає більше шуму.

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

Під час тесту в тихих умовах я виявляю, що за 100 запусків останнього коду код видає нуль 51 раз. 100 пробігів при галасливих умовах виробляли нуль у 40 разів.

Редагувати: Дякую Емілю, що вказав на недолік у вихідному коді :-)


1
Що станеться, якщо запис не замовк і немає ненульових зразків?
Еміль

1
Гарне питання. Деякі нулі, як правило, спливають, тому що значення коливаються навколо нуля (звукові коливання) і обмежена кількість десятків. Але тепер, коли ви це згадуєте, це, звичайно, має бути "<0", а не ~ = 0, щоб я замість цього рахував кількість негативних зразків. : -] Це теж випадково.
Абулафія

0

Баш

(Спасибі, Деннісе.)

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

1
Якщо я не повністю помиляюся, це покладається лише на системний час та поточний стан програмного забезпечення комп'ютера, і, крім того, потрібен користувач, щоб увійти в систему.
Wrzlprmft

@Wrzlprmft: wпоказує список зареєстрованих користувачів, який може бути порожнім. Навантаження системи базується на довжині черги процесора.
Денніс

Ну, я міг би замінити wз top.
Soham Chowdhury

0

Бере найменш значущий біт акселерометра комп'ютера (потрібен hdapsмодуль 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)

Це в основному вимірює шум датчика.


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. Вісь 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

Баш

Я взяв власну пропозицію Сохама (використовуючи top):

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

Редагувати: Це працює так само, як це робить Сохам. Він перетворює всі нечислові символи у висновку зверху в '+', а потім евакулює парність отриманого рядка.

прапор 'b' доверху запускає його в пакетному режимі, так що він повідомляє про всі процеси, а не лише про першому екрані, а 'n1' каже просто виконати 1 ітерацію верху.


Чи справді є якась різниця між вашою програмою та програмою Сохама?
clismique
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.