বাশ ডকুমেন্টেশন বলছে যে প্রত্যেকবার $RANDOM
রেফারেন্স করা হয়, 0 এবং 32767 এর মধ্যে একটি এলোমেলো সংখ্যা ফিরে আসে। যদি আমরা পরপর দুটি রেফারেন্স যোগ করি তবে আমরা 0 থেকে 65534 পর্যন্ত মান পাই যা 2000 এবং 65000 এর মধ্যে একটি এলোমেলো সংখ্যার জন্য 63001 সম্ভাবনার কাঙ্ক্ষিত পরিসীমা জুড়ে।
এটিকে সঠিক পরিসরে সামঞ্জস্য করতে আমরা মডুলো o৩০০১ যোগ করি, যা আমাদের 0 থেকে 63000 এর মধ্যে একটি মান দেয় turn পরিবর্তে 2000 থেকে 65000 এর মধ্যে পছন্দসই র্যান্ডম সংখ্যা সরবরাহ করতে কেবল 2000 দ্বারা একটি বৃদ্ধি প্রয়োজন This এটি হতে পারে নিম্নলিখিত হিসাবে সংক্ষিপ্তসার:
port=$((((RANDOM + RANDOM) % 63001) + 2000))
পরীক্ষামূলক
# Generate random numbers and print the lowest and greatest found
test-random-max-min() {
max=2000
min=65000
for i in {1..10000}; do
port=$((((RANDOM + RANDOM) % 63001) + 2000))
echo -en "\r$port"
[[ "$port" -gt "$max" ]] && max="$port"
[[ "$port" -lt "$min" ]] && min="$port"
done
echo -e "\rMax: $max, min: $min"
}
# Sample output
# Max: 64990, min: 2002
# Max: 65000, min: 2004
# Max: 64970, min: 2000
গণনার সঠিকতা
গণনার নির্ভুলতার জন্য এখানে একটি পূর্ণ, নিষ্ঠুর শক্তি পরীক্ষা করা হচ্ছে। এই প্রোগ্রামটি পরীক্ষার অধীনে গণনাটি ব্যবহার করে এলোমেলোভাবে সমস্ত 63001 বিভিন্ন সম্ভাবনা তৈরি করার চেষ্টা করে। --jobs
পরামিতি এটা দ্রুত রান করা উচিত, কিন্তু এটা (উত্পন্ন 63001 চেয়ে কম হতে পারে সম্ভাবনার মোট) নির্ণায়ক নয়।
test-all() {
start=$(date +%s)
find_start=$(date +%s)
total=0; ports=(); i=0
rm -f ports/ports.* ports.*
mkdir -p ports
while [[ "$total" -lt "$2" && "$all_found" != "yes" ]]; do
port=$((((RANDOM + RANDOM) % 63001) + 2000)); i=$((i+1))
if [[ -z "${ports[port]}" ]]; then
ports["$port"]="$port"
total=$((total + 1))
if [[ $((total % 1000)) == 0 ]]; then
echo -en "Elapsed time: $(($(date +%s) - find_start))s \t"
echo -e "Found: $port \t\t Total: $total\tIteration: $i"
find_start=$(date +%s)
fi
fi
done
all_found="yes"
echo "Job $1 finished after $i iterations in $(($(date +%s) - start))s."
out="ports.$1.txt"
[[ "$1" != "0" ]] && out="ports/$out"
echo "${ports[@]}" > "$out"
}
say-total() {
generated_ports=$(cat "$@" | tr ' ' '\n' | \sed -E s/'^([0-9]{4})$'/'0\1'/)
echo "Total generated: $(echo "$generated_ports" | sort | uniq | wc -l)."
}
total-single() { say-total "ports.0.txt"; }
total-jobs() { say-total "ports/"*; }
all_found="no"
[[ "$1" != "--jobs" ]] && test-all 0 63001 && total-single && exit
for i in {1..1000}; do test-all "$i" 40000 & sleep 1; done && wait && total-jobs
p/q
সমস্ত 63001 সম্ভাব্য উত্পন্ন হওয়ার সম্ভাব্যতার প্রদত্ত সম্ভাবনা পাওয়ার জন্য কতগুলি পুনরাবৃত্তি প্রয়োজন তা নির্ধারণ করার জন্য, আমি বিশ্বাস করি যে আমরা নীচের প্রকাশটি ব্যবহার করতে পারি। উদাহরণস্বরূপ, এখানে 1/2 এর চেয়ে বেশি সম্ভাবনার জন্য গণনা এবং এখানে 9-10 / 10-রও বেশি ।
shuf
তুলনামূলকভাবে সাম্প্রতিক - আমি গত কয়েক বছরে এটি উবুন্টু সিস্টেমে দেখেছি কিন্তু বর্তমান আরএইচইএল / সেন্টোসগুলিতে নয়।