Импровизировать аппаратный генератор случайных чисел

53

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

Вызов

Напишите программу со следующими свойствами:

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

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

Разъяснения и ограничения

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

  • Системное время не считается физическим процессом.
  • Вы можете использовать любое аппаратное обеспечение потребительского уровня, которое вам нравится, от 8-дюймовых дисков с флоппи-дисководами до ракетной пусковой установки USB и наушников - если только оно не предназначено для генерации случайных чисел. Аппаратное обеспечение является потребительским, если оно производится серийно и стоит менее 1000 долл. США / £ / £, поэтому вы не можете использовать радиотелескопы, ЦЕРН, МРТ или детектор частиц вашего дома.
  • Вы можете сделать только самые базовые предположения о состоянии и выравнивании оборудования, такие как включение (если оно имеет выключатель питания) и правильная установка и функционирование. Например, вы можете предположить, что дисковод для компакт-дисков, как правило, способен читать диск и не быть застрявшим, но вы не можете считать его открытым или закрытым или содержать диск. В другом примере вы не можете предположить, что два компонента оборудования выровнены для обеспечения особого взаимодействия, но вы можете предположить, что они находятся в одной комнате.
  • Вы можете оставить оборудование в любом понравившемся вам состоянии, если только вы не сломаете его.
  • Вы можете и должны предполагать, что оборудование находится в естественной среде, но не более того. Например, вы можете предположить, что аппаратное обеспечение не находится в резервуаре с жидким гелием, ни в чрезвычайно звуко- и светонепроницаемой комнате, ни в космосе. Однако вы не можете предполагать наличие каких-либо источников звука и света, кроме тех, которых можно избежать только радикальными усилиями.
  • Ваша программа должна работать на стандартном настольном компьютере с неэзотерической операционной системой по вашему выбору. Вы можете использовать любое программное обеспечение, специально не предназначенное для генерации случайных чисел.
  • Вы не можете получить доступ к Интернету.
  • Вы не можете ни предполагать, что люди присутствуют, либо отсутствовать, но вы можете предположить, что никто не намеренно вмешивается в вашу программу, например, вручную останавливая вентилятор или запуская программу, которая ничего не делает, кроме как выключает микрофон как можно чаще.
  • Вы можете сделать только самые основные предположения о настройках программного обеспечения. Например, вы можете предполагать, что драйверы установлены и активированы, но вы должны быть готовы к отключению звука.
  • Вы можете оставить настройки программного обеспечения в любом понравившемся вам состоянии.

бонус

Специальное вознаграждение было присуждено за особенно короткое решение. Это было скорее по количеству инструкций и похожих, чем по символам. Победители были (связаны по моим критериям):

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

Wrzlprmft
источник
2
Является ли гироскоп, подобный тем, что встречаются в новых смартфонах и ноутбуках, потребительским оборудованием?
Nzall
@NateKerkhofs: Да.
Wrzlprmft
На самом деле, можем ли мы получить определение «аппаратного обеспечения потребительского уровня»? Является ли "что-либо, что вы можете купить в вашем местном компьютерном магазине менее чем за 500 долларов США, или что вы можете получить как часть машины за 1000 долларов США" приемлемым определением?
ноября
1
Позвольте мне вставить небольшую мелочь здесь, есть реальный генератор случайных чисел на основе квантовой механики, работающий в Австралийском национальном университете. Взгляните: qrng.anu.edu.au/index.php
Александр Телес

Ответы:

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 ))
флигель
источник
Что если у меня отключен микрофон? Разве это не должно быть совершенным молчанием?
йети
3
@yeti: Ну конечно. Но мы можем допустить, что «аппаратное обеспечение включено и функционирует», что, я думаю, и охватывает это.
Весь
3
для меня включение звука - довольно большой (и раздражающий) побочный эффект для «псевдослучайного» двоичного генератора ^^
Оливье Дюлак,
1
Вы можете попробовать снабдить колонки некоторыми данными cat /dev/urandom > /dev/dsp, просто если компьютер находится в звукоизоляционной комнате / камере / коробке / корпусе / пространстве.
Исмаэль Мигель
именно то, что я хотел сделать!
короткая теория
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'преобразует каждый ноль и не цифру в знак плюс и 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здесь.
Ср 22-14
2
Использование Windows pingподтверждено. Я удивлен.
Ср 22-14
1
@JamesSnell: вот тогда проблема. Пинг Windows не имеет достаточной точности; он всегда будет показывать время 1 мс ...
Деннис
6
Похоже, что это нарушает ограничение № 2: Пинг локальный хост полностью зависит от внутреннего состояния компьютера.
Тофир
2
Сложно сказать. @ Денис: Вы знаете, откуда происходит колебание?
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 здесь .

Использует HTML5 DeviceMotion API на поддерживаемых устройствах (в основном на мобильных устройствах). Он превращает полученный accelerationобъект в JSON, хэширует его и получает остаток по модулю 2.

Большая часть кода - это хеш-функция (чёрт возьми, JavaScript и полное отсутствие стандартной библиотеки). Вероятно, это может быть короче, но я любитель хорошей хэш-функции.

James_pic
источник
40
«Пожалуйста, встряхните устройство, чтобы создать новый пароль».
PTwr
21

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

Использование кода бессовестно украденные из здесь , берет shapshot с помощью веб - камеры, хэши данные и печатает наименее значащий бит.

#!/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
James_pic
источник
8
В хорошем хэше нет "наименее значимого бита". Да, я знаю, что вы имели в виду
gnibbler
11
@ 11684, возможно, в камере достаточно теплового шума и т. Д., Чтобы предотвратить идентичные результаты
gnibbler
2
Свет должен сильно колебаться (внешний свет идет вверх / вниз и, конечно, какие-либо "мерцания", которые может излучать компьютер)
Оливье Дюлак
7
Это в значительной степени основано на том, что сделал мой друг. Он был заинтересован в использовании радиоактивного распада для генерации действительно случайных чисел. Он разобрал веб-камеру и дымовую пожарную сигнализацию, поместил изотоп рядом с ПЗС-матрицей и написал некоторый код, чтобы указать расположение обнаруженных бета-излучений в / dev / random. Однако мы обнаружили, что даже если мы отключили весь свет снаружи, на ПЗС-матрице было заметное количество фонового шума, хотя бета-излучение все еще можно было обнаружить.
James_pic
15

Perl

Проверяет время отклика вашего жесткого диска, синхронизируя три операции:

  • Читая свой собственный источник
  • Удаляя себя
  • Пишу снова

Наконец, взятое время упаковывается как число с плавающей запятой, и используется 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
Это выглядит так, что не будет касаться какого-либо оборудования и будет детерминированным при работе в виртуальной машине, что является очень распространенным сценарием.
Петерис
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'преобразует каждый ноль и не цифру в знак плюс, а echo $[...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 секунд, но может сильно отличаться. Особенно не запускайте это как root, или, по крайней мере, не изменяйте его, чтобы исключить /proc/kcore(если вы не хотите тратить много времени на включение энтропии, содержащейся там, которая, вероятно, действительно включает все)

PlasmaHH
источник
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 секунд (включая нечитаемые зашифрованные данные из соседних сетей), принимает хэш sha512 пакетных данных и возвращает 1, если первая буква хеша равна 0-7. , Предполагается, что ваша карта Wi-Fi есть wlan0, и что у вас нет mon0устройства.

Если поблизости нет устройств Wi-Fi, выходной сигнал будет предсказуемым, так как он будет одинаковым каждый раз.

James_pic
источник
1
Хм, я бы не стал считать отсутствие вай-фай устройств настолько неестественным, что им можно пренебречь.
Wrzlprmft
3
@Wrzlprmft Это зависит от того, где вы находитесь. Неестественно не иметь сетей Wi-Fi в переполненном городском районе. В универсальном масштабе отсутствие почти полного вакуума не является справедливым допущением, и, если оно ограничено Землей, справедливо предположить, что компьютер не погружен в воду.
Ян Д. Скотт
1
@ IanD.Scott: Ну, следующая зона бесплатного Wi-Fi для меня на самом деле находится в подвале (не спрашивайте меня, почему я это знаю). И я не живу в глуши. В любом случае, количество компьютеров в окружении без Wi-Fi, безусловно, превышает количество (работающих) компьютеров в воде или в вакууме на несколько порядков. (В конце концов, все сводится к вашему определению естественного , я думаю.)
Wrzlprmft,
8

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

Следующая короткая программа для Linux 80386 проверяет, доступно ли периферийное устройство с помощью 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
FUZxxl
источник
12
«Вы можете использовать любое […] аппаратное обеспечение […] - если только оно не предназначено для генерации случайных чисел ». - Цель состоит в том, чтобы импровизировать аппаратный генератор случайных чисел, а не использовать его.
Wrzlprmft
18
@Wrzlprmft rdrandне является генератором случайных чисел. Это периферийное устройство, созданное для АНБ, чтобы связываться с криптографией людей.
FUZxxl
1
На самом деле, я не заметил это предложение до написания этой программы. Виноват.
FUZxxl
7

удар

Стремление к наиболее излишне дорогому методу сбора случайных чисел. Время, которое требуется, чтобы порождать emacs миллион раз, затем использовать трюк Денниса, чтобы превратить время, взятое в один логический тип (на моей машине это занимает около 7 секунд).

$[`(time (seq 1000000 | xargs -P1000 emacs  >/dev/null 2>&1)) |& sed 's/[^1-9]/+/g'`0&1]
Крис Джефферсон
источник
1
с усреднением отклонение может быть очень маленьким…
Сардж Борщ
7

Arduino Mega1280

edit: обновленная версия, которая устойчива к подключению чего-либо к контактам. Идея основана на том факте, что 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;
}
helloworld922
источник
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;
soktinpk
источник
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

Matlab

Решение для микрофона:

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.
Сохам Чоудхури
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
12Me21
источник
-3

удар

Я принял предложение Сохама (используя top):

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

Редактировать: он работает так же, как и Сохем. Он превращает все нечисловые символы в выводе top в '+' и затем вычисляет четность полученной строки.

флаг 'b' наверх запускает его в пакетном режиме, так что он сообщает обо всех процессах, а не только о первом скрине, а 'n1' говорит о том, чтобы просто запустить 1 итерацию top.

Кит Уолтерс
источник
Есть ли какая-то разница между вашей программой и программой Сохема?
clismique