Trong một chương trình, tôi cần đặt một biến thành giá trị ngẫu nhiên là 0 hoặc 1.
Tôi không thể tìm ra cách để làm điều đó và Google đã làm tôi thất bại.
Trong một chương trình, tôi cần đặt một biến thành giá trị ngẫu nhiên là 0 hoặc 1.
Tôi không thể tìm ra cách để làm điều đó và Google đã làm tôi thất bại.
Câu trả lời:
Một phương pháp dễ dàng là sử dụng $RANDOM
để truy xuất số nguyên 16 bit giả trong phạm vi [0; 32767]. Bạn chỉ có thể chuyển đổi nó thành [0; 1] bằng cách tính modulo 2 của số ngẫu nhiên:
echo $(( $RANDOM % 2 ))
Thông tin thêm về Bash's $RANDOM
: http://www.tldp.org/LDP/abs/html/randomvar.html
Với cấu trúc đơn giản đó, bạn có thể dễ dàng xây dựng các tập lệnh mạnh mẽ bằng cách sử dụng ngẫu nhiên, như trong truyện tranh này ...
$[]
cú pháp lỗi thời - ai biết liệu họ rm
có --no-preserve-root
tính năng đó không?
rm: it is dangerous to operate recursively on '/'
rm: use --no-preserve-root to override this failsafe
, họ cúi thấp đầu và biết rằng họ đã thua trò chơi, tiến hành xóa đĩa của họ dd
, vì danh dự.
--no-preserve-root
được triển khai "gần đây". Không có thông tin về thời điểm nó được triển khai, nhưng IIRC nó chỉ mới vài năm tuổi. Và đó là một số tiền rất nhỏ khi nói đến Linux. Đây là một vé về điều này: bug.launchpad.net/ubfox/+source/coreutils/+orms/174283
Bạn đã có thể sử dụng 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
Thí dụ:
$ 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
Làm thế nào về:
#!/bin/bash
r=$(($RANDOM % 2))
echo $r
Hoặc thậm chí:
r=$(($(od -An -N1 -i /dev/random) % 2))
Hoặc có lẽ:
r=$(seq 0 1 | sort -R | head -n 1)
Hoặc hackily hơn:
r=$(($(head -128 /dev/urandom | cksum | cut -c1-10) % 2))
Và cũng:
r=$(apg -a 1 -M n -n 1 -m 8 -E 23456789 | cut -c1)
Cũng như:
r=$((0x$(cut -c1-1 /proc/sys/kernel/random/uuid) % 2))
Kịch bản này không có lợi ích hơn câu trả lời hiện có. Chỉ nhằm mục đích giải trí ...
Nhận một byte từ /dev/urandom
(mặc dù nói chung việc gửi các ký tự nhị phân tùy ý đến bàn điều khiển không được khuyến nghị ™ vì nó có thể cho kết quả không mong muốn / khó hiểu):
head -c 1 /dev/urandom
Và biến thành số thập phân:
head -c 1 /dev/urandom | od -An -t u1
Và nhận phần còn lại của nó bằng 2:
echo $((`head -c 1 /dev/urandom | od -An -t u1` % 2))
--no-preserve-root
- vì vậy có lẽ không phải trò chơi Roulette Nga mà họ đang hy vọng ...