Penggantian baris perintah acak non-acak di Perl

Apa cara yang baik dan ringkas untuk menghindari nilai acak berurutan yang mendekati? misalnya, menggunakan rand di Perl, tetapi memastikan perbedaan/distribusi minimum 0,2x antara nilai berurutan? Saya sudah mencoba beberapa ide seperti mengambil sampel ulang Rand jika nilainya mendekati, tetapi kemudian saya memerlukan skrip, dan saya tidak tahu bagaimana melakukannya dengan rapi dalam satu baris.

Konteksnya adalah saya sedang melakukan pencarian-penggantian menggunakan baris perintah dengan Perl. Idenya adalah bahwa di setiap baris, sebuah string diganti dengan nilai acak dari sebuah array.

echo ":z:z:z:" | tr ':' '\n' | perl -pe '@numbers=(1.2, 3.4, 5.6, 7.8); $number = $numbers[rand @numbers];  s/z/" : ".( $number )/ge'

Outputnya kira-kira seperti ini:

: 3.4
: 5.6
: 5.6
: 1.2

Lihat bagaimana 5.6 berulang? Saya ingin menghindari hal itu. Dalam kasus penggunaan saya, array @numbers berisi ~100 elemen. Saya ingin menyesuaikan rand @numbers sehingga nilai array yang dipilih berjauhan.


person Albert Jones    schedule 10.03.2017    source sumber
comment
Terkait: Bagaimana cara mengambil n elemen secara acak dari array Perl?   -  person ThisSuitIsBlackNot    schedule 10.03.2017
comment
Apakah baris input akan selalu lebih sedikit daripada angka di array Anda?   -  person ThisSuitIsBlackNot    schedule 10.03.2017
comment
lacak nilai sebelumnya, dan jika Anda mendapatkan nilai baru terlalu dekat, coba lagi rand?   -  person ysth    schedule 10.03.2017
comment
Terima kasih atas pertanyaannya, dan maaf atas lambatnya balasan. Akan ada lebih banyak baris masukan daripada ukuran array. yaitu elemen array akan digunakan kembali. Selain itu, saya tertarik untuk menghindari elemen terdekat, bukan hanya pengulangan.   -  person Albert Jones    schedule 11.03.2017
comment
Tentukan di dekatnya.   -  person ThisSuitIsBlackNot    schedule 11.03.2017
comment
Bayangkan arraynya 100 angka, 1..100. Saya tidak ingin dua angka acak berurutan berada dalam jarak 20 satu sama lain.   -  person Albert Jones    schedule 11.03.2017


Jawaban (1)