Ö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
Ö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
Yanıtlar:
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[@]}]}
.
x=(10 100 1000)
bash bir değişmez bir dizi oluşturur, bu daha okunabilir ve daha deyimsel olurdu
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?
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
GNU coreutils shuf
yardımcı programını da kullanabilirsiniz :
a=$(shuf -n1 -e 10 100 1000)
Kullanımı RANDOM
diğer cevaplar göre neredeyse kesinlikle daha hızlı olsa.
İşte biraz şifreli bir yol:
printf -v var '1%0*d' $(( RANDOM % 3 + 1 )) 0
Bu, rastgele değeri gerektiği $var
gibi atar . printf
Biçim dizesi 1%0Nd
- bu neden 0
ile basılacak N
gelen sıfır, N
bir aralık içinde bir rasgele bir tam sayı olacaktır [1,3]
.