हार्डवेयर रैंडम-नंबर जेनरेटर में सुधार करें


53

आपका काम एक हार्डवेयर रैंडम-नंबर जनरेटर को इम्प्रूव करना है, जो भी हार्डवेयर आपके आस पास पड़ा है।

चुनौती

निम्नलिखित गुणों के साथ एक कार्यक्रम लिखें:

  1. यह 0या तो प्रिंट करता है या 1(और कुछ नहीं)।
  2. आउटपुट एक भौतिक प्रक्रिया पर निर्भर करता है और न केवल कंप्यूटर की आंतरिक स्थिति पर।
  3. बाद के रन के आउटपुट (एक मिनट के अलावा) के बीच कोई संबंध नहीं है।
  4. आउटपुट किसी भी यथार्थवादी प्रयास के साथ अनुमानित नहीं है।
  5. आउटपुट की संभावना 00.2 और 0.8 के बीच है।
  6. यह एक मिनट से भी कम समय में एक उच्च संभावना के साथ चलता है।

आपको यह स्पष्ट करना चाहिए कि आपके कार्यक्रम में ये गुण क्यों हैं, यदि यह स्पष्ट नहीं है।

स्पष्टता और प्रतिबंध

निम्नलिखित एक लोकप्रियता प्रतियोगिता के लिए बहुत सारे प्रतिबंधों की तरह लग सकता है, लेकिन यह सुनिश्चित करने के लिए अल्टिमेटली है कि यह कार्यक्रम सवाल की भावना के भीतर बना हुआ है, कुछ हद तक काम करता है और उन समाधानों से बचने के लिए है जो कुल ओवरकिल होने के कारण लोकप्रिय हैं, लेकिन संपूर्ण रूप से बल्कि उबाऊ।

  • सिस्टम का समय शारीरिक प्रक्रिया के रूप में नहीं गिना जाता है।
  • आप किसी भी उपभोक्ता-ग्रेड हार्डवेयर का उपयोग कर सकते हैं जो 8-इंच फ्लॉपी-डिस्क ड्राइव से लेकर यूएसबी रॉकेट लांचर से हेडफ़ोन तक - जैसे कि जब तक कि यह यादृच्छिक-संख्या पीढ़ी के लिए न हो। हार्डवेयर का एक टुकड़ा उपभोक्ता-ग्रेड है, अगर यह बड़े पैमाने पर उत्पादित है और इसकी कीमत 1000 डॉलर / € / पाउंड से कम है, तो आप रेडियो टेलीस्कोप, सर्न, एमआरआई या अपने घर-निर्मित कण डिटेक्टर का उपयोग नहीं कर सकते।
  • आप केवल राज्य की सबसे बुनियादी धारणाएं बना सकते हैं और हार्डवेयर को संरेखित कर सकते हैं जैसे कि स्विच किया जा रहा है (यदि इसमें पावर स्विच है) और ठीक से स्थापित और कार्यात्मक हो। उदाहरण के लिए, आप एक सीडी ड्राइव को डिस्क पढ़ने में सक्षम होने के लिए और जाम नहीं होने के लिए मान सकते हैं, लेकिन आप इसे खोलने या बंद करने या डिस्क को शामिल करने के लिए नहीं मान सकते हैं। एक अन्य उदाहरण में आप हार्डवेयर के दो टुकड़ों को एक विशेष बातचीत के लिए संरेखित करने के लिए संरेखित नहीं कर सकते हैं, लेकिन आप उन्हें एक ही कमरे में रहने के लिए मान सकते हैं।
  • आप अपनी पसंद के किसी भी राज्य में हार्डवेयर छोड़ सकते हैं, जब तक कि आप इसे नहीं तोड़ते।
  • आप एक प्राकृतिक वातावरण में हार्डवेयर को ग्रहण कर सकते हैं, लेकिन इससे ज्यादा कुछ नहीं। उदाहरण के लिए आप मान सकते हैं कि हार्डवेयर लिक्विड हीलियम के टैंक में नहीं है और न ही बेहद साउंड- और लाइटप्रूफ रूम में और न ही स्पेस में। हालाँकि, आप किसी भी ध्वनि को नहीं मान सकते हैं- और लाइट्स को मौजूद होने के लिए छोड़कर, जो केवल कट्टरपंथी प्रयासों से बचा जा सकता है।
  • आपकी पसंद के गैर-गूढ़ ऑपरेटिंग सिस्टम के साथ आपका प्रोग्राम एक मानक डेस्कटॉप कंप्यूटर पर चलना चाहिए। आप किसी भी सॉफ़्टवेयर को नियोजित कर सकते हैं जो विशेष रूप से यादृच्छिक-संख्या पीढ़ी के लिए डिज़ाइन नहीं किया गया है।
  • आप इंटरनेट का उपयोग नहीं कर सकते।
  • आप न तो मनुष्यों को मौजूद हो सकते हैं और न ही अनुपस्थित मान सकते हैं, लेकिन आप यह मान सकते हैं कि कोई भी जानबूझकर आपके कार्यक्रम में हस्तक्षेप नहीं करता है, उदाहरण के लिए, एक प्रशंसक को मैन्युअल रूप से रोककर या एक प्रोग्राम चलाकर जो कुछ भी नहीं करता है, लेकिन माइक्रोफ़ोन को जितनी बार हो सके स्विच करना बंद कर देता है।
  • आप केवल सॉफ्टवेयर सेटिंग्स के बारे में सबसे बुनियादी धारणा बना सकते हैं। उदाहरण के लिए, आप ड्राइवरों को स्थापित और सक्रिय मान सकते हैं, लेकिन आपको ध्वनि को म्यूट करने के लिए तैयार रहना चाहिए।
  • आप अपनी पसंद के किसी भी राज्य में सॉफ़्टवेयर सेटिंग छोड़ सकते हैं।

बोनस

एक विशेष इनाम को विशेष रूप से संक्षिप्त समाधान से सम्मानित किया गया। यह निर्देशों की संख्या और वर्णों के समान था। विजेता थे (मेरे मानदंड के अनुसार):

मैं केवल एक जवाब दे सकता था और तेजस काले का जवाब बहुत कुछ जीता।


2
क्या एक जाइरोस्कोप जैसे नए स्मार्टफोन और लैपटॉप में पाए जाने वाले उपभोक्ता हार्डवेयर माने जाते हैं?
नजल्ल

@ नाटेकरखोफ: हाँ।
Wrzlprmft

वास्तव में, क्या हम "उपभोक्ता-ग्रेड हार्डवेयर" की परिभाषा प्राप्त कर सकते हैं? क्या "कुछ भी आप अपने स्थानीय कंप्यूटर स्टोर पर 500 अमरीकी डालर से कम में खरीद सकते हैं, या एक स्वीकार्य परिभाषा के तहत आप 1,000 अमरीकी डालर की मशीन के हिस्से के रूप में प्राप्त कर सकते हैं?"
नजला


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
@ यति: ठीक है, निश्चित। लेकिन हमें यह मानने की अनुमति है कि "हार्डवेयर चालू और कार्यात्मक है", जो मुझे लगता है कि कवर करता है।
एलए

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यहाँ।
rr-

2
Windows pingकी पुष्टि का उपयोग करना । मैं आश्चर्यचकित हूँ।
आरआर-

1
@ जेम्सस्नेल: यह समस्या तब है। विंडोज पिंग में पर्याप्त सटीकता नहीं है; यह हमेशा 1 एमएस का समय दिखाएगा ...
डेनिस

6
ऐसा लगता है कि प्रतिबंध # 2 का उल्लंघन करता है: पिंगिंग लोकलहोस्ट पूरी तरह से कंप्यूटर की आंतरिक स्थिति पर निर्भर करता है।
टॉपर

2
कहना मुश्किल है। @ डेनिस: क्या आप जानते हैं कि उतार-चढ़ाव कहां से आता है?
Wrzlprmft

25

जावास्क्रिप्ट + एचटीएमएल 5 डिवाइसमोशन

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

JSFiddle यहाँ

समर्थित उपकरणों (ज्यादातर मोबाइल उपकरणों) पर HTML5 DeviceMotion API का उपयोग करता है। यह परिणामी accelerationवस्तु को JSON में बदल देता है , इसे हैश करता है, और शेष मॉडुलो 2 लेता है।

अधिकांश कोड हैश फ़ंक्शन (लानत है आप जावास्क्रिप्ट, और आपके मानक पुस्तकालय की कुल कमी)। यह शायद कम हो सकता है, लेकिन मैं एक अच्छे हैश फ़ंक्शन के लिए एक चूसने वाला हूं।


40
"नया पासवर्ड जनरेट करने के लिए कृपया डिवाइस को हिलाएं।"
पीटीओआर

21

अजगर + वेबकैम

यहां से बेशर्मी से चोरी किए गए कोड का उपयोग करके, अपने वेबकैम का उपयोग करके एक शापशॉट लेता है, डेटा को हैश करता है, और कम से कम महत्वपूर्ण बिट प्रिंट करता है।

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

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

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

8
एक अच्छे हैश में "कम से कम महत्वपूर्ण बिट" नहीं है। हाँ, मुझे पता है कि आपका क्या मतलब था
gnibbler

11
@ 11684, समान परिणाम को रोकने के लिए कैमरे में संभवतः पर्याप्त थर्मल शोर आदि है
gnibbler

2
प्रकाश में थोड़ा बहुत उतार-चढ़ाव होना चाहिए (बाहर की रोशनी ऊपर / नीचे जा रही है, और निश्चित रूप से किसी भी "ब्लिंकेंलाइट्स" को कंप्यूटर संभवतः उत्सर्जित करता है)
ओलिवियर डुलैक

7
यह शिथिल है जो मेरे एक मित्र ने किया है। वह वास्तव में यादृच्छिक संख्या उत्पन्न करने के लिए रेडियोधर्मी क्षय का उपयोग करने में रुचि रखते थे। उन्होंने एक वेब कैमरा और एक स्मोक अलार्म को विघटित किया, आइसोटोप को सीसीडी के बगल में रख दिया, और पता लगाया बीटा उत्सर्जन के स्थानों को / dev / random में फीड करने के लिए कुछ कोड लिखे। हालांकि, हमने पाया कि भले ही हमने बाहर से सभी प्रकाश को सील कर दिया था, लेकिन सीसीडी पर पृष्ठभूमि शोर की एक औसत दर्जे की मात्रा थी, हालांकि बीटा उत्सर्जन अभी भी पता लगाने योग्य थे।
जेम्स_पिक


15

पर्ल

आपके हार्डड्राइव की प्रतिक्रिया समय की जाँच करता है, तीन कार्यों के समय के अनुसार:

  • इसका अपना स्रोत पढ़ना
  • खुद को हटाना
  • फिर से लिखना

अंत में, लिया गया समय एक फ्लोट के रूप में पैक किया जाता है, और 11 वें सबसे महत्वपूर्ण बिट का उपयोग किया जाता है (मंटिसा का दूसरा सबसे महत्वपूर्ण बिट)।

use Time::HiRes qw(time);

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

unlink $0;

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

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

1
एक प्रोग्राम जो डिस्क को स्वयं हटाता है और लिखता है वह कुछ है जो मैं केवल एक पर्ल या अजगर प्रोग्रामर की कल्पना कर सकता हूं। बहुत अच्छा विचार है!
iFreilicht

यह ऐसा कुछ दिखता है जो किसी भी हार्डवेयर को स्पर्श नहीं करेगा और एक वीएम के भीतर चलने पर नियतात्मक होगा, जो एक बहुत ही सामान्य परिदृश्य है।
पीटरिस

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*(जैसे शेड्यूल / शेड्यूलैट) उन प्रक्रियाओं को जीवंत करने के लिए आवश्यक हार्डवेयर की गति पर निर्भर करती हैं।
  • जिन चीजों के बारे में मैंने नहीं सोचा होगा, वे उन फाइलों में भी उपलब्ध हैं।

मेरे सिस्टम पर रनटाइम ~ 10 s है, लेकिन बहुत भिन्न हो सकते हैं। विशेष रूप से इसे रूट के रूप में न चलाएं, या कम से कम इसे बाहर करने के लिए संशोधित करें /proc/kcore(जब तक कि आप वहां निहित एन्ट्रापी को शामिल करने के लिए बहुत समय बिताने के लिए तैयार न हों, जिसमें संभवतः सब कुछ शामिल होगा)


9

शेल + वाई-फाई

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

वाई-फाई कार्ड को मॉनिटर मोड में डालता है, प्राप्त किए गए पैकेट के 30 सेकंड के मूल्य (पड़ोसी नेटवर्क से अपठित एन्क्रिप्टेड डेटा सहित) को डंप करता है, पैकेट डेटा का sha512 हैश लेता है, और हैश का पहला अक्षर 0-4 होने पर 1 देता है । मान लें कि आपका वाई-फाई कार्ड है wlan0, और आपके पास वर्तमान में कोई mon0डिवाइस नहीं है।

यदि आस-पास वाई-फाई डिवाइस नहीं हैं, तो आउटपुट अनुमानित होगा, क्योंकि यह हर बार समान होगा।


1
हम्म, मैं वाई-फाई उपकरणों की अनुपस्थिति को इतना अस्वाभाविक नहीं मानूंगा कि आप इसे उपेक्षित कर सकें।
Wrzlprmft

3
@Wrzlprmft यह निर्भर करता है कि आप कहां हैं। एक भीड़ भरे शहरी क्षेत्र में वाईफाई नेटवर्क नहीं होना अप्राकृतिक है। एक सार्वभौमिक पैमाने पर, कुल वैक्यूम में नहीं होना एक उचित धारणा नहीं है, और न ही अगर पृथ्वी तक सीमित है तो यह मान लेना कि कंप्यूटर पानी में डूबा नहीं है।
इयान डी। स्कॉट

1
@ IanD.Scott: खैर, मेरे लिए अगला वाईफाई-मुक्त क्षेत्र वास्तव में तहखाने में है (मुझसे यह मत पूछिए कि मुझे यह क्यों पता है)। और मैं कहीं के बीच में नहीं रह रहा हूं। वैसे भी, वाईफाई-फ्री सर्ाउंडिंग में कंप्यूटरों की संख्या निश्चित रूप से पानी के भीतर (काम करने वाले) कंप्यूटरों की संख्या या परिमाण के कई आदेशों से अधिक होती है। (यह सब अंत में प्राकृतिक की आपकी परिभाषा के लिए नीचे आता है , मुझे लगता है।)
Wrzlprmft

8

इंटेल द्वारा निर्मित आधुनिक 8086 संगत प्रोसेसर में आसानी से सुलभ परिधीय होता है जो उचित यादृच्छिकता उत्पन्न करता है। उस परिधीय ड्राइविंग को rdrandनिर्देश का उपयोग करके किया जाता है जो या तो एक यादृच्छिक बिट पैटर्न उत्पन्न करता है या कैरी फ्लैग सेट करता है यदि परिधीय अनुपलब्ध है या एंट्रोपी से बाहर है।

80386 लिनक्स के लिए निम्न संक्षिप्त कार्यक्रम यह जांचता है कि क्या परिधीय 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एक यादृच्छिक संख्या जनरेटर नहीं है। यह लोगों के क्रिप्टोग्राफी के साथ खिलवाड़ करने के लिए NSA के लिए बना एक परिधीय है।
फ़ूजएक्सएक्सएक्सएल

1
दरअसल, मैंने इस प्रोग्राम को लिखने से पहले उस वाक्य को नोटिस नहीं किया था। मेरी गलती।
13

7

दे घुमा के

सबसे अनावश्यक रूप से महंगी यादृच्छिक संख्या एकत्रित करने की विधि का लक्ष्य। समय कितना समय लग जाता है एक लाख बार emacs, तो एक बार बुलियन (मेरी मशीन पर लगभग 7 सेकंड लेता है) में समय को चालू करने के लिए डेनिस चाल का उपयोग करें।

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

1
औसत के साथ, विचलन बहुत छोटा हो सकता है ...
सर्ज बोर्श

7

अरुडिनो मेगा 1280

संपादित करें: अपडेट किया गया संस्करण जो कि पिन में प्लग किए गए किसी भी चीज के मुकाबले मजबूत है। यह विचार इस तथ्य पर निर्भर करता है कि ATMega1280 वॉचडॉग थरथरानवाला के लिए एक अलग आंतरिक थरथरानवाला का उपयोग करता है। मैं बस एक वॉचडॉग सेटअप को सेट करता हूं जो एक ध्वज सेट करता है, सिस्टम घड़ी पर आधारित एक काउंटर होता है (Arduino पर यह एक 16MHz बाहरी क्रिस्टल है), और घड़ी घबराना / विचरण काम करने की अनुमति देता है।

#include <avr/interrupt.h>

int time;
volatile bool wdt_ran;

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

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

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

5

जावास्क्रिप्ट

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

वीडियो इनपुट लेता है

आप स्क्रीनशॉट देख सकते हैं कि इसका उपयोग यादृच्छिक संख्या की गणना करने के लिए किया गया था।

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

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

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

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

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

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

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

1
मुझे FF में एक बग मिला, "साझा करना बंद करें" वेबकैम की बारी नहीं है!
फ्रैंक

3

लिनक्स पर शेल

इस डिस्क पर अक्सर अद्यतन निर्देशिका की हार्ड ड्राइव + एक्सेस समय की रीड स्पीड को मापें जो कि अप्रत्याशित है।

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

आवश्यकता है:

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

इस दृष्टिकोण का लाभ सिस्टम पर किसी भी डेटा को संशोधित नहीं करने और प्राइमो के एक पर पर्ल की आवश्यकता नहीं है।


3

खोल

लिनक्स पर परीक्षण किया गया है, लेकिन हो सकता है कि आपके U * IX में / proc / स्टेट भी हो?

यह केवल एक अतिरिक्त प्रक्रिया शुरू करता है, केवल एक अतिरिक्त फ़ाइल (डिस्क पर भी नहीं) पढ़ता है और 37 अक्षर छोटा है। यह भी बहुत तेज है।

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

कोई यह सोच सकता है कि यह सभी कर्नेल और यूजरलैंड प्रक्रिया द्वारा निर्धारित किया गया है, लेकिन ऐसा नहीं है, क्योंकि / proc / स्टेट में IO- प्रतीक्षा समय, हार्डवेयर व्यवधान का समय, निष्क्रिय कार्य में व्यतीत समय और कुछ अन्य सभी शामिल हैं। बाहरी हार्डवेयर इनपुट पर निर्भर करते हैं।


यह जवाब मेरे मानदंडों द्वारा एक विशेष रूप से छोटे जवाब के लिए इनाम के लिए बंधा हुआ था और बहुत कुछ खो दिया था।
Wrzlprmft

2

Matlab

माइक्रोफोन समाधान:

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

ध्वनि के 10 सेकंड रिकॉर्ड करता है, रिकॉर्डिंग में नकारात्मक नमूनों की संख्या 0 पाता है और यदि यह विषम है तो यह संख्या 1 और 1 है। इस प्रकार 50% संभावना के साथ 0। दृष्टिकोण का मतलब है कि एक छोटी मात्रा में भी, एक मूक रिकॉर्डिंग में अपरिहार्य, एक यादृच्छिक आउटपुट उत्पन्न करने के लिए पर्याप्त होगा। निम्नलिखित थोड़ी लंबी कोड एक छोटी रिकॉर्डिंग का उपयोग करके संख्या जनरेटर को गति देता है, एक उच्च बिटरेट के साथ मुआवजा दिया जाता है, जो अधिक शोर देता है।

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लॉग इन उपयोगकर्ताओं की सूची दिखाता है, जो खाली हो सकते हैं। सिस्टम लोड CPU कतार लंबाई पर आधारित है।
डेनिस

खैर, मैं के wसाथ बदल सकता है top
सोहम चौधरी

0

कंप्यूटर के एक्सेलेरोमीटर का कम से कम महत्वपूर्ण हिस्सा लेता है ( hdapsलिनक्स मॉड्यूल की जरूरत है ):

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

संपादित करें: यह उसी तरह काम करता है जैसे सोहम करता है। यह शीर्ष के आउटपुट में सभी गैर संख्यात्मक वर्णों को '+' में बदल देता है और फिर परिणामी स्ट्रिंग की समता को विकसित करता है।

'बी' फ्लैग टू टॉप इसे बैच मोड में चलाता है ताकि यह सभी प्रक्रियाओं को रिपोर्ट करे, न कि केवल पहले स्क्रीनफुल और 'एन 1' को टॉप के 1 पुनरावृत्ति को चलाने के लिए कहा जाए।


क्या वास्तव में आपके और सोहम के कार्यक्रम में कोई अंतर है?
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.