Cách đặt biến thành giá trị ngẫu nhiên bằng bash


14

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:


30

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 ...

Cam kết dải - Roulette Nga


4
Người giáo viên trong tôi cảm thấy cần phải chỉ ra rằng lệnh phá hủy máy chủ sản xuất được chọn sẽ không làm gì nếu không có --no-preserve-root- vì vậy có lẽ không phải trò chơi Roulette Nga mà họ đang hy vọng ...
Boris the Spider

2
@BoristheSpider họ đang sử dụng $[]cú pháp lỗi thời - ai biết liệu họ rm--no-preserve-roottính năng đó không?
muru

10
@BoristheSpider Giải thích của tôi về truyện tranh là, khi họ nhìn thấy tin nhắn 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ự.
Eliah Kagan

@EliahKagan ah, seppuku. Hiểu.
nhện của

@BoristheSpider: Việc mới --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
Apache

13

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

5

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))

1

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))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.