เป็นไปได้ไหมที่จะมีตัวแปรที่เลือกสุ่มหมายเลขจากสามหมายเลขที่ตัดสินใจล่วงหน้า?
ตัวอย่าง:
var= 10 or 100 or 1000
เป็นไปได้ไหมที่จะมีตัวแปรที่เลือกสุ่มหมายเลขจากสามหมายเลขที่ตัดสินใจล่วงหน้า?
ตัวอย่าง:
var= 10 or 100 or 1000
คำตอบ:
$RANDOM
ใช้อาร์เรย์เพื่อเก็บค่าและเลือกในหมู่พวกเขาใช้ในตัวในตัวแปร ตัวอย่างเช่น,
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
คุณภาพของการสุ่มจะไม่เป็นไปได้ที่ดีที่สุด (อ่านไบต์จาก/dev/urandom
สำหรับที่) แต่มันควรจะดีกว่าพอสำหรับสคริปต์
หมายเหตุ 1:ในฐานะที่เป็นคนได้ตั้งข้อสังเกตในการแสดงความคิดเห็นแทนการเริ่มต้นองค์ประกอบอาร์เรย์เป็นรายบุคคลหนึ่งสามารถของหลักสูตรใช้ litteral x=(10 100 1000)
อาร์เรย์:
หมายเหตุ 2:แทนที่การเข้ารหัสจำนวนองค์ประกอบในอาร์เรย์อย่างหนักองค์ประกอบเรเดียมสามารถถูกแยกออกมา${x[$RANDOM%${#x[@]}]}
ได้
x=(10 100 1000)
จะสร้างอาร์เรย์จากตัวอักษรในทุบตีนี้จะอ่านง่ายขึ้นและสำนวนมากขึ้น
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.
บางอย่างเช่นนั้น?
หากคุณใช้bash (หรือzshหรือksh93 ) คุณสามารถทำได้:
echo "$((10**($RANDOM%3+1)))"
หรือ
var=$((10**($RANDOM%3+1)))
เพื่อกำหนดให้กับvar
คุณยังสามารถใช้shuf
ยูทิลิตี้ GNU coreutils :
a=$(shuf -n1 -e 10 100 1000)
การใช้RANDOM
ตามคำตอบอื่น ๆ นั้นเกือบจะเร็วกว่าอย่างแน่นอน
case $(( RANDOM % 3 )) in
0)
var=10
;;
1)
var=100
;;
2)
var=1000
;;
esac
นี่เป็นวิธีที่คลุมเครือเล็กน้อย:
printf -v var '1%0*d' $(( RANDOM % 3 + 1 )) 0
สิ่งนี้จะกำหนดค่าการสุ่มให้$var
ตามที่ต้องการ printf
สตริงรูปแบบ1%0Nd
- นี่เป็นสาเหตุ0
ที่จะพิมพ์ด้วยN
เลขศูนย์ชั้นนำที่จะเป็นจำนวนเต็มสุ่มในช่วงN
[1,3]