Bagaimana cara mendapatkan keacakan dalam baris perintah?

11

Bagaimana cara mengeksekusi satu perintah secara acak dalam daftar perintah yang ditentukan? Bermanfaat untuk secara acak memilih suara startup, wallpaper, atau menjalankan perintah.

Secara umum, jika saya memiliki perintah untuk dieksekusi sebagai berikut maka Bagaimana saya mendapatkan keacakan :?

#!/bin/bash
<command_1>
<command_2>
<command_3>
.
.
.
<command_n>

Maka saya ingin menjalankan secara acak hanya satu perintah dari kemungkinan di atas ketika skrip dijalankan!

Bagaimana cara melakukannya?

Pandya
sumber
Contoh praktis: askubuntu.com/a/257471/163331
Parto
@Parto saya sudah menambahkan sebagai jawaban sebelumnya
Pandya
Saya tidak berusaha menjawab, hanya memberi contoh di mana bisa digunakan.
Parto

Jawaban:

21

Variabel $RANDOM(sebenarnya fungsi bash) mengembalikan angka acak dari 0 hingga 32767 inklusif.

Anda biasanya ingin membatasi rentangnya dengan membaginya dengan beberapa nomor dan mengambil sisanya, misalnya.

# output a random number 0 to 3
echo $((RANDOM % 4))

Dalam contoh sederhana ini akan sangat sedikit bias untuk setiap pembagi yang tidak terbagi rata menjadi 32768 (misalnya, apa pun yang bukan kekuatan dua), tetapi dalam skenario Anda, saya tidak berpikir Anda akan bermasalah sedikit bias.

Untuk memilih file acak, beri nama file Anda sesuatu seperti:

file0.jpg
file1.jpg
file2.jpg
file3.jpg

Dan kemudian Anda dapat memilih yang acak dengan

# output a random file from file0.jpg to file3.jpg
echo "file$((RANDOM % 4)).jpg"
thomasrutter
sumber
1
Anda mungkin ingin mempostingnya sebagai jawaban Anda sendiri - itu kemudian dapat memberi Anda reputasi.
thomasrutter
penggunaan bermanfaat RANDOM, saya diterima!
Pandya
1
Perhatikan bahwa RANDOM% N tidak menghasilkan distribusi yang sama kecuali jika jumlah nilai yang mungkin dari RANDOM (32768) dapat dibagi oleh N. Untuk melihat ini, bayangkan rentang RANDOM adalah 0-4 (5 nilai yang mungkin), dan N adalah 2: ada tiga cara untuk $ RANDOM% 2 untuk menghasilkan 0 (jika $ RANDOM menghasilkan 0, 2, 4) tetapi dua cara untuk menghasilkan 1 (1, 3). Untuk distribusi yang sama Anda harus menemukan kelipatan N terbesar yang lebih kecil dari 32767 dan mengabaikan nilai acak apa pun yang lebih besar dari itu. Dalam contoh sebelumnya, itu berarti mengabaikan 5, yang lebih besar dari 4.
Doval
@Doval saya mengatakan itu dalam jawaban saya, apakah Anda melihatnya?
thomasrutter
@neon_overload Buruk saya, saya melewatkan sedikit itu.
Doval
7

Menurut jawaban @neon_overload (menggunakan RANDOM),
saya dapat memasukkan RANDOMcontoh skrip sebagai berikut (untuk 4 perintah):

#!/bin/bash
random_selection=$((RANDOM % 4))

case $random_selection in

  0)
  <command_1>
  ;;

  1)
  <command_2>
  ;;

  2)
  <command_3>
  ;;

  3)
  <command_4>
  ;;

esac
Pandya
sumber
2

Jika Anda ingin keacakan melalui situs eksternal daripada yang dihasilkan oleh komputer Anda, Anda dapat menggunakan skrip ini:

curl "http://www.random.org/integers/?num=1&min=$1&max=$2&col=1&base=10&format=plain&rnd=new"

Jalankan sebagai rand (MIN) (MAX) (dengan asumsi Anda menyimpan sebagai / usr / bin / rand)

Anda mungkin harus menginstal curl terlebih dahulu (sudo apt-get install curl) jika belum diinstal.

iggyvolz
sumber
0

Anda dapat menggunakan shufperintah dari GNU coreutils .

NAME
       shuf - generate random permutations

SYNOPSIS
       shuf [OPTION]... [FILE]
       shuf -e [OPTION]... [ARG]...
       shuf -i LO-HI [OPTION]...

DESCRIPTION
       Write a random permutation of the input lines to standard output

Contoh:

$ shuf -i 1-5
4
1
2
5
3

$ shuf -e Debian Ubuntu Trisquel 
Trisquel
Debian
Ubuntu

Sekarang, Untuk mendapatkan satu entri acak Anda dapat menggunakan -n 1output mana baris pertama.

Contoh untuk mencetak nomor acak dari 1-100:

$ shuf -i 1-100 -n 1
37

Jika Anda sudah filememiliki konten berikut:

$ cat file
command-1
command-2
command-3
command-4
command-5

Anda juga dapat melakukan sesuatu seperti:

$ shuf file -n 1
command-3
Pandya
sumber