Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การแก้ไขปัญหา >> Linux

สร้างเลขสุ่มใน Bash: คู่มือฉบับย่อ

สามารถสร้างเลขสุ่มที่พรอมต์ bash ได้ง่าย แล้วนำไปกำหนดให้ตัวแปร ใช้ได้ทั้งเขียนสคริปต์ เล่นเกม TRPG (เช่น D&D) หรือตรวจสอบความปลอดภัยเบื้องต้น (แต่ผู้โจมตีเก่งอาจ繞ผ่านได้ ยังใช้สร้างรหัสผ่าน/โค้ดได้)

มีหลายวิธี ไม่ใช่วิธีไหนก็เหมาะทุกสถานการณ์ เราทดสอบทุกวิธีแล้ว ต้องใช้เทอร์มินัล: กด Ctrl+Alt+T หรือ Super+T เปิดเทอร์มินัล หรือค้นหา "terminal" ใน Dash/เมนู หรือ Ctrl+Alt+F1-F6 เข้าคอนโซลเสมือน

วิธีที่ 1: สุ่มไบต์เต็ม (1-256)

รันคำสั่ง:

od -An -N1 -tu1 /dev/urandom

อย่าใช้ /dev/random เพราะอาจกิน entropy ของโปรแกรมอื่น เพื่อกำหนดให้ตัวแปร ranNum:

ranNum=$(($(od -An -N1 -tu1 /dev/urandom)))

ranNum จะได้ค่า 1-256 ทำงานได้ทั้งบรรทัดคำสั่งและในสคริปต์ เปลี่ยนชื่อตัวแปรได้ตามต้องการ

วิธีที่ 2: สุ่ม 1 ถึงค่าที่กำหนด

รัน echo $[RANDOM%40+1] ได้เลขสุ่ม 1-40 แทนที่ 40 ด้วยค่าใดก็ได้ (ขีดจำกัดขึ้นกับสถาปัตยกรรมเครื่อง) ตัวอย่าง สุ่ม 1-10:

ranNum=$[RANDOM%10+1]

ค่าสูงสุดรวมอยู่ในผลลัพธ์ (10 อาจออกมา) หากอยากลดลง ให้เปลี่ยนค่าตรงๆ (เช่น 9) ไม่ต้องคิด -1 แบบ C/C++ เพราะจะให้ผลผิดปกติ

วิธีที่ 3: สุ่มบิตเดี่ยว (0 หรือ 1)

ต้องการตัวแปรเป็น 0 หรือ 1 ใช้:

ranNum=$(($(od -An -N1 -i /dev/urandom) % 2))

ranNum จะเป็น 1 หรือ 0 ขึ้นกับเลขคู่/คี่จาก /dev/urandom ใช้ได้กับ logic yes/no แบบง่าย

ถ้าต้องการสุ่มมากกว่านั้น ใช้ /proc/sys/kernel/random:

ranNum=$((0x$(cut -c1-1 /proc/sys/kernel/random/uuid) % 2))

ยังคงได้แค่ 0 หรือ 1 เหมาะกับ logic ไบนารี ใช้ในสคริปต์ bash ได้ วิธีนี้อาจดีกว่าเมื่อวิธีแรกล้มเหลว

วิธีที่ 4: เขียนสคริปต์ bash สำหรับสุ่มเลข

สร้างสคริปต์ไว้ใช้งานง่าย ใช้ bash มาตรฐาน ทำงานได้กับ Linux ทุกตัวและ BSD หลายตัว แนะนำ cd ~/.local/bin ก่อน เพื่อรันได้จากทุกที่

พิมพ์ nano random หรือ vi random (ตั้งชื่ออื่นได้) ใส่โค้ด:

#!/bin/bash
ranNum=$(($RANDOM % 2))
echo $ranNum

กด Ctrl+O บันทึก (nano) Ctrl+X ออก กลับมาที่พรอมต์ รัน chmod +x random ทำให้รันได้ เปลี่ยนบรรทัดกลางเพื่อควบคุมช่วงเลข ตัวอย่าง สุ่ม 1-50:

#!/bin/bash
ranNum=$[RANDOM%50+1]
echo $ranNum

ตอนนี้พิมพ์ random ที่ไหนก็ได้ จะได้เลขสุ่มตามที่ตั้งไว้