วิธีการตั้งค่าตัวแปรให้เป็นค่าแบบสุ่มด้วย bash


14

ในโปรแกรมฉันต้องตั้งค่าตัวแปรเป็นค่าสุ่มทั้ง 0 หรือ 1

ฉันไม่สามารถหาวิธีที่จะทำได้และ Google ทำให้ฉันล้มเหลว

คำตอบ:


30

วิธีการง่าย ๆ อย่างหนึ่งคือการใช้$RANDOMเพื่อดึงหมายเลขจำนวนเต็ม 16 บิตหลอกเทียมในช่วง [0; 32767] คุณสามารถแปลงเป็น [0; 1] โดยการคำนวณแบบโมดูโล 2 ของจำนวนสุ่ม:

echo $(( $RANDOM % 2 ))

ข้อมูลเพิ่มเติมเกี่ยวกับ Bash's $RANDOM: http://www.tldp.org/LDP/abs/html/randomvar.html

ด้วยโครงสร้างที่เรียบง่ายนั้นคุณสามารถสร้างสคริปต์ที่ทรงพลังได้อย่างง่ายดายโดยใช้การสุ่มในการ์ตูนนี้ ...

Commit Strip - รูเล็ตรัสเซีย


4
คนอวดรู้ในตัวฉันรู้สึกว่าจำเป็นที่จะต้องชี้ให้เห็นว่าคำสั่งทำลายเซิร์ฟเวอร์ที่ใช้งานจริงจะไม่ทำอะไรเลย--no-preserve-root- ดังนั้นอาจไม่ใช่เกมรูเล็ตรัสเซียที่พวกเขาหวังไว้ ...
Boris the Spider

2
@BoristheSpider พวกเขากำลังใช้$[]ไวยากรณ์ที่ล้าสมัย- ใครจะรู้ว่าพวกเขาrmมี--no-preserve-rootคุณสมบัตินั้นหรือไม่
muru

10
@BoristheSpider การตีความการ์ตูนของฉันคือเมื่อพวกเขาเห็นข้อความrm: it is dangerous to operate recursively on '/' rm: use --no-preserve-root to override this failsafeพวกเขาก็ก้มหน้าลงต่ำและเมื่อรู้ว่าพวกเขาแพ้เกมไปแล้วให้ลบดิสก์ด้วยความddเคารพ
Eliah Kagan

@EliahKagan ah, seppuku เข้าใจ
Boris the Spider

@BoristheSpider: ผู้ที่--no-preserve-rootเพิ่งนำมาใช้ "เร็ว ๆ นี้" ไม่มีข้อมูลเกี่ยวกับเมื่อมีการใช้งาน แต่ IIRC เป็นเพียงไม่กี่ปี และนั่นเป็นจำนวนเล็กน้อยเมื่อพูดถึง Linux นี่คือตั๋วเกี่ยวกับสิ่งนี้: 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))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.