Trong ksh
, Bash, Zsh, Yash hoặc BusyBox sh
:
[ "$RANDOM" -lt 3277 ] && do_stuff
Biến RANDOM
đặc biệt của các vỏ Korn, Bash, Yash, Z và BusyBox tạo ra giá trị số nguyên thập phân giả ngẫu nhiên trong khoảng từ 0 đến 32767 mỗi khi nó được đánh giá, do đó, ở trên có cơ hội một phần mười.
Bạn có thể sử dụng điều này để tạo ra một hàm hoạt động như được mô tả trong câu hỏi của bạn, ít nhất là trong Bash:
function chance {
[[ -z $1 || $1 -le 0 ]] && return 1
[[ $RANDOM -lt $((32767 / $1 + 1)) ]]
}
Việc quên cung cấp một đối số hoặc cung cấp một đối số không hợp lệ sẽ tạo ra kết quả là 1, vì vậy chance && do_stuff
sẽ không bao giờ do_stuff
.
Này sử dụng công thức chung cho “1 trong n ” sử dụng $RANDOM
, đó là [[ $RANDOM -lt $((32767 / n + 1)) ]]
, đưa ra một (⎣32767 / n ⎦ + 1) trong 32.768 cơ hội. Các giá trị n
không phải là yếu tố của 32768 đưa ra sai lệch do sự phân chia không đồng đều trong phạm vi của các giá trị có thể.