Bash RANDOM với hạt giống?


8

Tôi đã sử dụng $((1 + RANDOM % 1000))để tạo một số ngẫu nhiên.

Có thể làm một cái gì đó tương tự nhưng cung cấp một hạt giống?

Vì vậy, cho cùng một hạt giống số ngẫu nhiên giống nhau sẽ luôn luôn là đầu ra?

Câu trả lời:


14

Gán giá trị hạt giống cho RANDOM

$ bash -c 'RANDOM=640; echo $RANDOM $RANDOM $RANDOM'
28612 27230 24923
$ bash -c 'RANDOM=640; echo $RANDOM $RANDOM $RANDOM'
28612 27230 24923
$ bash -c 'RANDOM=640; echo $RANDOM $RANDOM $RANDOM'
28612 27230 24923
$ 

Lưu ý rằng dấu ngoặc đơn được sử dụng; báo giá kép chạy quy tắc nội suy vỏ afoul:

$ bash -c 'RANDOM=42; echo $RANDOM $RANDOM $RANDOM'
19081 17033 15269
$ RANDOM=42
$ bash -c "RANDOM=640; echo $RANDOM"
19081
$ bash -c "RANDOM=640; echo $RANDOM"
17033
$ bash -c "RANDOM=640; echo $RANDOM"
15269
$ 

bởi vì $RANDOMđang được nội suy bởi trình bao cha mẹ trước khi bash -c ...tiến trình con được chạy. Sử dụng dấu ngoặc đơn để tắt phép nội suy (như được hiển thị ở trên) hoặc ngăn cách nội suy:

$ RANDOM=42
$ SEED_FOR_MY_GAME=640
$ bash -c "RANDOM=$SEED_FOR_MY_GAME; echo \$RANDOM"
28612
$ bash -c "RANDOM=$SEED_FOR_MY_GAME; echo \$RANDOM"
28612
$ 

Tính năng RANDOMnày được đề cập trong bash(1)hướng dẫn

   RANDOM Each time this parameter is referenced, a random integer between
          0 and 32767 is generated.  The sequence of random numbers may be
          initialized by assigning a value to RANDOM.  If RANDOM is unset,
          it loses its special properties,  even  if  it  is  subsequently
          reset.

Nếu tôi chạy random=$(bash -c "RANDOM=640; echo $RANDOM")không nên trả lại như vậy mỗi lần? Hoặc là bởi vì $(bash ...không được coi là một trường hợp mới của bash?
Philip Kirkbride

1
doublequotes có lẽ không phải những gì bạn muốn có
thrig

1
Xem những gì xảy ra nếu bạn làm : set -x; FOO=42; bash -c "FOO=999; echo $FOO". Các dấu ngoặc kép đang cho phép lớp vỏ ngoài thay thế $RANDOMbằng ngẫu nhiên của lớp vỏ ngoài; shell bash bên trong chỉ đơn giản là lặp lại một số nguyên.
Jeff Schaller

@thrig Tôi cần báo giá gấp đôi vì trong trường hợp của tôi thực sự làrandom=$(bash -c "RANDOM=$mac; echo $RANDOM")
Philip Kirkbride

Tất nhiên là phải như vậy bash -c 'RANDOM=42; echo "$RANDOM" "$RANDOM" "$RANDOM"'.
G-Man nói 'Phục hồi Monica'
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.