Làm thế nào để tôi có được sự ngẫu nhiên trong dòng lệnh?


11

Làm thế nào để thực hiện ngẫu nhiên một lệnh trong danh sách lệnh được chỉ định? Hữu ích cho việc chọn ngẫu nhiên âm thanh khởi động, hình nền hoặc thực hiện các lệnh.

Nói chung, nếu tôi có các lệnh để thực hiện như sau thì làm thế nào để tôi có được sự ngẫu nhiên :?

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

Sau đó, tôi muốn thực hiện ngẫu nhiên chỉ một lệnh từ các khả năng trên khi tập lệnh được chạy!

Làm thế nào để làm điều đó?


Ví dụ thực tế: Askubfox.com/a/257471/163331
Parto

@Parto Tôi đã thêm vào như câu trả lời trước đây
Pandya

Tôi đã không cố gắng trả lời, chỉ đưa ra một ví dụ về nơi nó có thể được sử dụng.
Parto

Câu trả lời:


21

Biến $RANDOM(thực sự là hàm bash) trả về một số ngẫu nhiên từ 0 đến 32767.

Thông thường bạn sẽ muốn giới hạn phạm vi của nó bằng cách chia nó cho một số và lấy phần còn lại của nó, ví dụ.

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

Trong ví dụ đơn giản này, sẽ có một chút sai lệch cho bất kỳ ước số nào không chia đều cho 32768 (ví dụ: bất cứ điều gì không phải là sức mạnh của hai), nhưng trong kịch bản của bạn, tôi không nghĩ bạn sẽ gặp rắc rối bởi một chút thiên vị.

Để chọn một tệp ngẫu nhiên, bạn sẽ đặt tên cho các tệp của mình như:

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

Và sau đó bạn có thể chọn một ngẫu nhiên với

# output a random file from file0.jpg to file3.jpg
echo "file$((RANDOM % 4)).jpg"

1
Bạn có thể muốn đăng nó dưới dạng câu trả lời của riêng bạn - sau đó nó có thể mang lại cho bạn danh tiếng.
thomasrutter

sử dụng hữu ích RANDOM, tôi chấp nhận!
Pandya

1
Lưu ý rằng RANDOM% N không dẫn đến phân phối bằng nhau trừ khi số lượng giá trị có thể có của RANDOM (32768) chia hết cho N. Để thấy điều này, hãy tưởng tượng phạm vi của RANDOM thay vì 0-4 (5 giá trị có thể) và N là 2: có ba cách để $ RANDOM% 2 mang lại 0 (nếu $ RANDOM mang lại 0, 2, 4) nhưng hai cách để nó mang lại 1 (1, 3). Để phân phối bằng nhau, bạn phải tìm bội số N lớn nhất nhỏ hơn 32767 và bỏ qua mọi giá trị ngẫu nhiên lớn hơn giá trị đó. Trong ví dụ trước, số tiền bỏ qua 5, lớn hơn 4.
Doval

@Doval Tôi đã nói rằng trong câu trả lời của tôi, bạn có thấy nó không?
thomasrutter

@neon_overload Xấu của tôi, tôi đã bỏ lỡ bit đó.
Doval

7

Theo @neon_overload answer (bằng cách sử dụng RANDOM),
tôi có thể đưa RANDOMvào tập lệnh ví dụ như sau (cho 4 lệnh):

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

case $random_selection in

  0)
  <command_1>
  ;;

  1)
  <command_2>
  ;;

  2)
  <command_3>
  ;;

  3)
  <command_4>
  ;;

esac

2

Nếu bạn muốn sự ngẫu nhiên thông qua một trang web bên ngoài chứ không phải do một máy tính của bạn tạo ra, bạn có thể sử dụng tập lệnh này:

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

Chạy dưới dạng rand (MIN) (MAX) (giả sử bạn lưu dưới dạng / usr / bin / rand)

Bạn có thể phải cài đặt curl trước (sudo apt-get install curl) nếu nó chưa được cài đặt.


0

Bạn có thể sử dụng shuflệnh từ 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

Thí dụ:

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

$ shuf -e Debian Ubuntu Trisquel 
Trisquel
Debian
Ubuntu

Bây giờ, để có được một mục ngẫu nhiên, bạn có thể sử dụng -n 1đầu ra dòng đầu tiên.

Ví dụ để in số ngẫu nhiên từ 1-100:

$ shuf -i 1-100 -n 1
37

Nếu bạn filecó nội dung sau:

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

Bạn cũng có thể làm một cái gì đó như:

$ shuf file -n 1
command-3
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.