Cara mengatur variabel ke nilai acak dengan bash

14

Dalam sebuah program, saya perlu mengatur variabel ke nilai acak 0 atau 1.

Saya tidak tahu bagaimana melakukannya dan Google telah mengecewakan saya.

cheesits456
sumber

Jawaban:

30

Salah satu metode mudah adalah menggunakan $RANDOMuntuk mengambil nomor integer 16 bit pseudorandom dalam kisaran [0; 32767]. Anda bisa mengubahnya menjadi [0; 1] dengan menghitung modulo 2 dari nomor acak:

echo $(( $RANDOM % 2 ))

Informasi lebih lanjut tentang Bash $RANDOM: http://www.tldp.org/LDP/abs/html/randomvar.html

Dengan konstruksi sederhana itu, Anda dapat dengan mudah membuat skrip yang kuat menggunakan keacakan, seperti dalam komik ini ...

Strip Komit - Roulette Rusia

Komandan Byte
sumber
4
Pedant dalam diriku merasa perlu menunjukkan bahwa server produksi yang dipilih menghancurkan perintah tidak akan melakukan apa pun tanpa --no-preserve-root- jadi mungkin bukan permainan Roulette Rusia yang mereka harapkan ...
Boris the Spider
2
@ BoristheSpider mereka menggunakan $[]sintaks kuno - siapa yang tahu apakah mereka rmmemiliki --no-preserve-rootfitur itu?
muru
10
@BoristheSpider Penafsiran saya tentang komik adalah bahwa, ketika mereka melihat pesan rm: it is dangerous to operate recursively on '/' rm: use --no-preserve-root to override this failsafe, mereka menundukkan kepala dan, mengetahui bahwa mereka telah kehilangan permainan, melanjutkan untuk menghapus disk mereka dengan dd, demi kehormatan.
Eliah Kagan
@EliahKagan ah, seppuku. Dimengerti
Boris the Spider
@ BoristheSpider: Yang --no-preserve-rootdiimplementasikan hanya "belakangan ini". Tidak memiliki informasi kapan penerapannya, tetapi IIRC baru berusia beberapa tahun. Dan itu jumlah yang sangat kecil ketika datang ke Linux. Ini tiketnya: bugs.launchpad.net/ubuntu/+source/coreutils/+bug/174283
Apache
13

Anda bisa menggunakannya 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

Contoh:

$ 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
Zanna
sumber
5

Bagaimana tentang:

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

Atau bahkan:

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

Atau mungkin:

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

Atau lebih tepatnya:

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

Dan juga:

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

Sebaik:

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

Skrip ini tidak memiliki manfaat dibandingkan jawaban yang ada. Hanya untuk tujuan hiburan ...

Dapatkan satu byte dari /dev/urandom(meskipun secara umum mengirim karakter biner sewenang-wenang ke konsol tidak disarankan ™ karena mungkin memberikan hasil yang tidak terduga / membingungkan):

head -c 1 /dev/urandom

Dan berubah menjadi angka desimal:

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

Dan dapatkan sisa pembagiannya dengan 2:

echo $((`head -c 1 /dev/urandom | od -An -t u1` % 2))
Sasha
sumber