Có thể có biến nào chọn một số ngẫu nhiên từ ba số được quyết định trước không?
Mẫu vật:
var= 10 or 100 or 1000
Có thể có biến nào chọn một số ngẫu nhiên từ ba số được quyết định trước không?
Mẫu vật:
var= 10 or 100 or 1000
Câu trả lời:
Sử dụng một mảng để giữ các giá trị và chọn trong số chúng bằng cách sử dụng biến tích hợp $RANDOM
. Ví dụ,
x[0]=10 # One decade
x[1]=100 # One century
x[2]=1000 # One millennium
for ((i=1; i < 20; ++i)); do echo -n " ${x[$RANDOM%3]}"; done; echo
1000 10 10 10 10 100 10 100 100 10 10 100 100 100 10 1000 1000 1000 10
Chất lượng của tính ngẫu nhiên sẽ không phải là tốt nhất có thể (đọc byte từ /dev/urandom
đó), nhưng nó sẽ không đủ tốt cho một tập lệnh.
Lưu ý 1: Như mọi người đã quan sát trong các nhận xét, thay vì khởi tạo từng phần tử mảng, tất nhiên người ta có thể sử dụng một mảng mảng : x=(10 100 1000)
.
Lưu ý 2: Thay vì mã hóa cứng số lượng phần tử trong mảng, một phần tử radom có thể được trích xuất bằng ${x[$RANDOM%${#x[@]}]}
.
x=(10 100 1000)
tạo ra một mảng từ bash theo nghĩa đen, điều này sẽ dễ đọc hơn và thành ngữ hơn
x[0]=10 # This sets the first value of x to ten. Ten is the number of fingers that humans have (excepting birth defects or mutilation). It is also the sum of 9 and 1, or product of 5 and 2. Ten is not prime. A traditional Christmas gift is ten lords a-leaping.
gì đó như thế?
Nếu bạn đang sử dụng bash (hoặc zsh hoặc ksh93 ), bạn có thể chỉ cần làm:
echo "$((10**($RANDOM%3+1)))"
hoặc là
var=$((10**($RANDOM%3+1)))
gán nó cho var
Bạn cũng có thể sử dụng shuf
tiện ích GNU coreutils :
a=$(shuf -n1 -e 10 100 1000)
Sử dụng RANDOM
theo các câu trả lời khác gần như chắc chắn nhanh hơn.
Đây là một cách hơi khó hiểu:
printf -v var '1%0*d' $(( RANDOM % 3 + 1 )) 0
Điều này sẽ gán giá trị ngẫu nhiên $var
theo yêu cầu. Chuỗi printf
định dạng là 1%0Nd
- điều này gây ra 0
được in bằng N
các số 0 đứng đầu, trong đó N
sẽ là một số nguyên ngẫu nhiên trong khoảng [1,3]
.