Biến ngẫu nhiên được chọn trong số ba số (10, 100 và 1000)


19

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

1
Tôi không lập trình trong UNIX, vì vậy tôi không thể viết mã, nhưng đây là một cách tiếp cận khác: val = left ("1000", length = Random 2 đến 4). Để có ba giá trị không liên quan, mã sẽ tương tự nhau.
Sensii Miller

Câu trả lời:


31

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[@]}]}.


5
+1 Trong khi câu trả lời của zeppinin là thông minh trong trường hợp cụ thể này, cách tiếp cận mảng thì tổng quát hơn nhiều.
Kamil Maciorowski

4
Có vẻ như 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
con mèo

1
@cat: Ý kiến ​​về khả năng đọc khác nhau. Tôi thích đặt các mục riêng lẻ trên các dòng riêng biệt, thường có các bình luận kéo dài giải thích giá trị.
AlexP

@AlexP Ồ, tôi đoán tôi sẽ không bình luận nếu tôi nghĩ đó là mục đích. đủ công bằng
mèo

1
@AlexP 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ế?
Nick T

30

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


:). Dễ dàng khi bạn nhìn thấy nó, nhưng tôi đã không. Cảm ơn!!
Espen Larsen


8
case $(( RANDOM % 3 )) in
    0)
        var=10
        ;;
    1)
        var=100
        ;;
    2)
        var=1000
        ;;
esac

5

Đâ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 $vartheo 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 Ncác số 0 đứng đầu, trong đó Nsẽ là một số nguyên ngẫu nhiên trong khoảng [1,3].

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.