बैश प्रलेखन कहता है कि हर बार $RANDOM
संदर्भित किया जाता है, 0 और 32767 के बीच एक यादृच्छिक संख्या वापस आ जाती है। यदि हम लगातार दो संदर्भों को जोड़ते हैं, तो हमें 0 से 65534 तक मान मिलते हैं, जो 2000 और 65000 के बीच यादृच्छिक संख्या के लिए 63001 संभावनाओं की वांछित सीमा को कवर करता है।
इसे सटीक सीमा तक समायोजित करने के लिए, हम modulo 63001 का उपयोग करते हैं, जो हमें 0 से 63000 तक का मूल्य देगा। इसके बदले में 2000 और 65000 के बीच वांछित यादृच्छिक संख्या प्रदान करने के लिए 2000 की वृद्धि की आवश्यकता है। यह हो सकता है संक्षेप में इस प्रकार है:
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
पैरामीटर यह तेजी से चलाने बनाना चाहिए, लेकिन यह (उत्पन्न 63,001 से कम हो सकती संभावनाओं की कुल) निर्धारित करने योग्य नहीं है।
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 से अधिक के लिए ।
shuf
है कि अपेक्षाकृत हाल ही में - मैंने पिछले कुछ वर्षों में इसे उबंटू सिस्टम पर देखा है, लेकिन वर्तमान आरएचईएल / सेंटोस नहीं।