Üç sayı (10, 100 ve 1000) arasından rastgele seçilen değişken


19

Önceden kararlaştırılmış üç sayıdan rastgele bir sayı seçen değişkene sahip olmak mümkün müdür?

Örneklem:

var= 10 or 100 or 1000

1
UNIX'te programlamıyorum, bu yüzden kodu yazamıyorum, ama burada başka bir yaklaşım var: val = left ("1000", length = Random 2 to 4). İlişkisiz üç değere sahip olmak için kod benzer olacaktır.
Sensii Miller

Yanıtlar:


31

Değerleri tutmak için bir dizi kullanın ve yerleşik değişkeni kullanarak bunlar arasında seçim yapın $RANDOM. Örneğin,

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

Rasgeleliğin kalitesi mümkün olan en iyi olmayacaktır (bunun için bayt okuyun /dev/urandom), ancak bir komut dosyası için yeterince iyi olmalıdır.

Not 1: İnsanların yorumlarda gözlemlediği gibi, dizi öğelerini ayrı ayrı başlatmak yerine elbette bir dizi litteral: kullanabilirsiniz x=(10 100 1000).

Not 2: Dizideki elemanların sayısını kodlamak yerine, bir radom elemanı tarafından çıkarılabilir ${x[$RANDOM%${#x[@]}]}.


5
+1 Zeppelin'in cevabı bu özel durumda akıllı olsa da, dizi yaklaşımı çok daha geneldir.
Kamil Maciorowski

4
Görünüşe göre x=(10 100 1000)bash bir değişmez bir dizi oluşturur, bu daha okunabilir ve daha deyimsel olurdu
kedi

1
@cat: Okunabilirlik hakkındaki görüşler değişiklik gösterir. Tek tek öğeleri ayrı satırlara koymayı seviyorum, genellikle değeri açıklayan sondaki yorumlarla.
AlexP

@AlexP Oh, bence bunun amaç olduğunu düşünürsem yorum yapmazdım. yeterince adil
kedi

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.böyle bir şey mi?
Nick T

30

Eğer bash (veya zsh veya ksh93 ) kullanıyorsanız şunları yapabilirsiniz:

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

veya

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

atamak için var


:). Gördüğün zaman kolay, ama ben görmedim. Teşekkürler!!
Espen Larsen


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

5

İşte biraz şifreli bir yol:

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

Bu, rastgele değeri gerektiği $vargibi atar . printfBiçim dizesi 1%0Nd- bu neden 0ile basılacak Ngelen sıfır, Nbir aralık içinde bir rasgele bir tam sayı olacaktır [1,3].

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.