Dalam sebuah program, saya perlu mengatur variabel ke nilai acak 0 atau 1.
Saya tidak tahu bagaimana melakukannya dan Google telah mengecewakan saya.
Dalam sebuah program, saya perlu mengatur variabel ke nilai acak 0 atau 1.
Saya tidak tahu bagaimana melakukannya dan Google telah mengecewakan saya.
Jawaban:
Salah satu metode mudah adalah menggunakan $RANDOM
untuk 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 ...
$[]
sintaks kuno - siapa yang tahu apakah mereka rm
memiliki --no-preserve-root
fitur itu?
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.
--no-preserve-root
diimplementasikan 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
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
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))
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))
--no-preserve-root
- jadi mungkin bukan permainan Roulette Rusia yang mereka harapkan ...