Saya mencoba untuk mencetak n
kata huruf acak , di mana saya masukan n
dari baris perintah itu sendiri, tetapi untuk beberapa alasan skrip saya memberi saya jawaban yang sama setiap kali ketika menggunakan nilai yang sama untuk n
.
#!/bin/bash
num=$1
egrep "^.{$num}$" /usr/share/dict/words | head -n $RANDOM| tail -n 1
Saya memanggil skrip saya seperti:
$ bash var3.sh 5
étude # always the same output when using 5
$ bash var3.sh 3
zoo # always the same output when using 3
di mana var3.sh
nama skrip saya dan 5 adalah panjang kata yang ingin saya cetak secara acak.
Bagaimana cara saya mencetak kata yang benar-benar acak?
$RANDOM
kemungkinan besar lebih besar daripada jumlah kata n- newsletter untuk sebagian besar nilai n (95,7% dari waktu untuk n = 3 untuk saya).shuf
atausort -R
seperti yang disarankan dalam jawaban. Anda juga dapat menggunakan$RANDOM
, tetapi dengan cara yang lebih maju. Semua alat ini menghasilkan hasil yang dapat diprediksi (mereka tidak benar-benar acak), tetapi mereka cepat dan cukup baik untuk banyak tujuan.Jawaban:
Tidak. Tetapi $ RANDOM mengembalikan angka besar (antara 0 dan 32767) yang, terutama untuk kata-kata dengan panjang terbatas, menunjukkan hasil yang sama, karena
head
bagian tersebut mungkin mengembalikan semua hasil grep (untuk 3, hanya ada 819 pertandingan di saya/usr/share/dict/words
).Solusi yang lebih baik mungkin untuk mengocok hasil:
egrep "^.{$num}$" /usr/share/dict/words | sort -R | tail -n 1
di mana
-R
berarti--random-sort
(sort
ekstensi GNU ).sumber
tail
? Itu masuk akal dalam skrip OP, tetapi karena Anda mengocok Anda juga bisa menggunakanhead
, dan kemudiansort
harus dapat mendeteksi pipa yang rusak dan tidak repot-repot mengocok sisa garis.shuf -n1
, yang merupakan satu pipa lebih sedikit ...Metode sederhana untuk mencetak kata num- newsletter sewenang-wenang menggunakan
shuf
:The
shuf
perintah output permutasi acak dari input, dan-n1
bendera mengatakan itu untuk hanya output item pertama dari hasil ini.sumber
grep -Ex ".{$num}"
. Atauawk 'length == n' n="$num"'
.Seperti yang telah ditunjukkan orang lain, masalah utama dengan kode Anda adalah bahwa
$RANDOM
lebih sering daripada tidak akan menjadi nilai yang jauh lebih besar daripada jumlah kata dengan panjang tertentu.Hanya menggunakan
awk
:Program membaca di semua baris dari file yang diberikan dengan panjang tertentu. Ini disimpan dalam array
words
.Pada akhirnya, elemen acak dari array ini dipilih dan dicetak.
sumber