बैश के साथ एक यादृच्छिक मूल्य के लिए एक चर सेट करने के लिए कैसे


14

एक कार्यक्रम में, मुझे 0 या 1 के यादृच्छिक मान पर एक चर सेट करना होगा।

मैं यह पता नहीं लगा सकता कि यह कैसे करना है और Google ने मुझे विफल कर दिया है।

जवाबों:


30

एक आसान तरीका है $RANDOMकि रेंज में एक छद्म आयामी 16 बिट पूर्णांक संख्या को पुनः प्राप्त करने के लिए उपयोग किया जाए [0; 32767]। आप बस इसे [0 में बदल सकते हैं; 1] यादृच्छिक संख्या के मोडुलो 2 की गणना करके:

echo $(( $RANDOM % 2 ))

बैश के बारे में अधिक जानकारी $RANDOM: http://www.tldp.org/LDP/abs/html/randomvar.html

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

कमिट स्ट्रिप - रूसी रूले


4
मुझमें पंडित को यह इंगित करने की आवश्यकता है कि चुने गए उत्पादन सर्वर को कमांड को नष्ट करने के बिना कुछ भी नहीं होगा --no-preserve-root- इसलिए शायद रूसी रूले का खेल नहीं है जो वे उम्मीद कर रहे थे ...
बोरिस स्पाइडर

2
@BoristheSpider वे प्राचीन $[]सिंटैक्स का उपयोग कर रहे हैं - कौन जानता है कि क्या उनके rmपास यह --no-preserve-rootसुविधा थी?
मुरू

10
@BoristheSpider कॉमिक की मेरी व्याख्या यह है कि जब वे संदेश देखते हैं, तो वे rm: it is dangerous to operate recursively on '/' rm: use --no-preserve-root to override this failsafeअपना सिर नीचा लटका लेते हैं और यह जानते हुए भी कि वे गेम हार गए हैं, अपनी डिस्क को मिटाने के लिए आगे बढ़ते हैं dd
एलियाह कगन

@ एलियाकगन आह, सिपुकु। समझ लिया।
बोरिस स्पाइडर

@ बोरिशाइपर: --no-preserve-rootकेवल "हाल ही में" लागू हुआ। इसे कब लागू किया गया, इसकी कोई जानकारी नहीं है, लेकिन IIRC यह केवल कुछ साल पुराना है। और यह एक छोटी राशि है जब यह लिनक्स की बात आती है। इस बारे में एक टिकट यहाँ है: Bugs.launchpad.net/ubuntu/+source/coreutils/+bug/174283
Apache

13

आप उपयोग कर सकते हैं shuf

DESCRIPTION
     Write a random permutation of the input lines to standard output.

     -i, --input-range=LO-HI
            treat each number LO through HI as an input line
     -n, --head-count=COUNT
            output at most COUNT lines

उदाहरण:

$ foo=$(shuf -i0-1 -n1)
$ echo $foo
1
$ foo=$(shuf -i0-1 -n1)
$ echo $foo
0
$ foo=$(shuf -i0-1 -n1)
$ echo $foo
0
$ foo=$(shuf -i0-1 -n1)
$ echo $foo
1

5

कैसा रहेगा:

#!/bin/bash
r=$(($RANDOM % 2))
echo $r

या और भी:

r=$(($(od -An -N1 -i /dev/random) % 2))

या शायद:

r=$(seq 0 1 | sort -R  | head -n 1)

या अधिक हैकली:

r=$(($(head -128 /dev/urandom | cksum | cut -c1-10) % 2))

और भी:

r=$(apg -a 1 -M n -n 1 -m 8 -E 23456789  | cut -c1)

साथ ही साथ:

r=$((0x$(cut -c1-1 /proc/sys/kernel/random/uuid) % 2))

1

इस स्क्रिप्ट का मौजूदा उत्तरों पर कोई लाभ नहीं है। सिर्फ मनोरंजन के उद्देश्य से ...

एक बाइट प्राप्त करें /dev/urandom(हालांकि सामान्य रूप से सांत्वना देने के लिए मनमाने ढंग से द्विआधारी वर्ण भेजने की सिफारिश नहीं की जाती है ™ क्योंकि यह अप्रत्याशित / भ्रमित परिणाम दे सकता है):

head -c 1 /dev/urandom

और दशमलव संख्या में बदल दें:

head -c 1 /dev/urandom | od -An -t u1

और इसके बचे हुए भाग को 2 से प्राप्त करें:

echo $((`head -c 1 /dev/urandom | od -An -t u1` % 2))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.