Variabel dipilih secara acak di antara tiga angka (10, 100, dan 1000)

19

Apakah mungkin untuk memiliki variabel yang mengambil nomor acak dari tiga angka yang ditentukan sebelumnya?

Mencicipi:

var= 10 or 100 or 1000
Espen Larsen
sumber
1
Saya tidak memprogram dalam UNIX, jadi saya tidak bisa menulis kode, tapi di sini ada pendekatan lain: val = kiri ("1000", length = Random 2 hingga 4). Untuk memiliki tiga nilai yang tidak terkait, kode akan serupa.
Sensii Miller

Jawaban:

31

Gunakan array untuk menyimpan nilai dan memilih di antara mereka menggunakan variabel bawaan $RANDOM. Sebagai contoh,

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

Kualitas keacakan tidak akan menjadi yang terbaik (baca byte dari /dev/urandomuntuk itu), tetapi harus lebih dari cukup untuk sebuah skrip.

Catatan 1: Sebagai orang telah diamati di komentar, bukannya menginisialisasi elemen array secara individual satu kaleng saja menggunakan litteral berbagai: x=(10 100 1000).

Catatan 2: Alih-alih mengkode jumlah elemen dalam array, elemen radom dapat diekstraksi dengan ${x[$RANDOM%${#x[@]}]}.

AlexP
sumber
5
+1 Meskipun jawaban zeppelin cerdas dalam kasus khusus ini, pendekatan array jauh lebih umum.
Kamil Maciorowski
4
Sepertinya x=(10 100 1000)membuat array dari literal di bash, ini akan lebih mudah dibaca dan lebih idiomatis
cat
1
@cat: Opini tentang keterbacaan bervariasi. Saya suka meletakkan item individual pada baris yang berbeda, biasanya dengan komentar tambahan yang menjelaskan nilai.
AlexP
@AlexP Oh, saya kira saya tidak akan berkomentar jika saya pikir itu sengaja. cukup adil
kucing
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.sesuatu seperti itu?
Nick T
30

Jika Anda menggunakan bash (atau zsh atau ksh93 ) Anda bisa melakukannya:

echo "$((10**($RANDOM%3+1)))"

atau

var=$((10**($RANDOM%3+1)))

untuk menetapkannya ke var

zeppelin
sumber
:) Mudah ketika Anda melihatnya, tetapi saya tidak melakukannya. Terima kasih!!
Espen Larsen
20

Anda juga dapat menggunakan shufutilitas GNU coreutils :

a=$(shuf -n1 -e 10 100 1000)

Menggunakan RANDOMsesuai jawaban lainnya hampir pasti lebih cepat.

Trauma Digital
sumber
Ini jawaban terbaik.
Tulains Córdova
8
case $(( RANDOM % 3 )) in
    0)
        var=10
        ;;
    1)
        var=100
        ;;
    2)
        var=1000
        ;;
esac
DopeGhoti
sumber
5

Inilah cara yang agak samar:

printf -v var '1%0*d' $(( RANDOM % 3 + 1 )) 0

Ini akan menetapkan nilai acak $varsesuai kebutuhan. The printfformat string adalah 1%0Nd- ini menyebabkan 0yang akan dicetak dengan Nnol terkemuka, di mana Nakan menjadi integer acak dalam interval [1,3].

Trauma Digital
sumber