การแทนที่บรรทัดคำสั่งแบบสุ่มแบบไม่สุ่มใน Perl

วิธีที่ดีและรัดกุมในการหลีกเลี่ยงค่าสุ่มตามลำดับซึ่งใกล้เคียงกันคืออะไร เช่นใช้ rand ใน Perl แต่รับประกันความแตกต่าง / การกระจายขั้นต่ำ 0.2x ระหว่างค่าลำดับใด ๆ ฉันได้ลองใช้แนวคิดบางอย่าง เช่น การสุ่มตัวอย่าง rand ใหม่หากค่าใกล้เคียงกัน แต่ฉันต้องการสคริปต์ และฉันไม่รู้ว่าจะทำอย่างไรให้หมดจดในบรรทัดเดียว

บริบทคือฉันกำลังทำการค้นหาแทนที่โดยใช้ commandline ด้วย Perl แนวคิดก็คือในแต่ละบรรทัด สตริงจะถูกแทนที่ด้วยค่าสุ่มจากอาร์เรย์

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'

ผลลัพธ์จะเป็นดังนี้:

: 3.4
: 5.6
: 5.6
: 1.2

ดูว่า 5.6 ซ้ำอย่างไร ฉันต้องการหลีกเลี่ยงสิ่งนั้น ในกรณีการใช้งานของฉัน อาร์เรย์ @numbers มีองค์ประกอบ ~100 องค์ประกอบ ฉันต้องการปรับ rand @numbers เพื่อให้ค่าอาร์เรย์ที่เลือกอยู่ห่างกันมากขึ้น


person Albert Jones    schedule 10.03.2017    source แหล่งที่มา
comment
comment
จะมีบรรทัดอินพุตน้อยกว่าตัวเลขในอาร์เรย์ของคุณหรือไม่?   -  person ThisSuitIsBlackNot    schedule 10.03.2017
comment
ติดตามค่าก่อนหน้า และหากคุณได้ค่าใหม่ใกล้เกินไป ให้ลอง rand อีกครั้งหรือไม่   -  person ysth    schedule 10.03.2017
comment
ขอบคุณสำหรับคำถาม และขออภัยที่ตอบช้า จะมีบรรทัดอินพุตมากกว่าขนาดของอาร์เรย์อย่างมากมาย นั่นคือองค์ประกอบอาร์เรย์จะถูกนำมาใช้ซ้ำ นอกจากนี้ ฉันสนใจที่จะหลีกเลี่ยงองค์ประกอบใกล้เคียง ไม่ใช่แค่ซ้ำกัน   -  person Albert Jones    schedule 11.03.2017
comment
กำหนดสถานที่ใกล้เคียง.   -  person ThisSuitIsBlackNot    schedule 11.03.2017
comment
ลองนึกภาพอาร์เรย์มีตัวเลข 100 ตัว 1..100 ฉันไม่ต้องการให้ตัวเลขสุ่มสองตัวติดต่อกันอยู่ในระยะ 20 จากกัน   -  person Albert Jones    schedule 11.03.2017


คำตอบ (1)