উত্তর:
ব্যবহার $RANDOM
। এটি প্রায়শই সাধারণ শেল পাটিগণিতের সাথে একত্রে কার্যকর। উদাহরণস্বরূপ, 1 এবং 10 (অন্তর্ভুক্ত) এর মধ্যে একটি এলোমেলো সংখ্যা তৈরি করতে:
$ echo $((1 + RANDOM % 10))
3
আসল জেনারেটরটি রয়েছে variables.c
, ফাংশনটিতে brand()
। পুরানো সংস্করণগুলি ছিল একটি সাধারণ লিনিয়ার জেনারেটর। সংস্করণ 4.0 এর bash
একটি জেনারেটর 1988-এর একটি কাগজে উদ্ধৃতি সহ ব্যবহার করে , সম্ভবত এটির অর্থ এটি সিউডোরেন্ডম সংখ্যার একটি শালীন উত্স। আমি এটি সিমুলেশনের জন্য ব্যবহার করব না (এবং অবশ্যই ক্রিপ্টোর জন্য নয়), তবে এটি সম্ভবত প্রাথমিক স্ক্রিপ্টিং কাজের জন্য পর্যাপ্ত।
আপনি যদি এমন কিছু করছেন যা গুরুতর এলোমেলো সংখ্যার প্রয়োজন হয় আপনি ব্যবহার করতে পারেন /dev/random
বা /dev/urandom
সেগুলি উপলভ্য থাকলে:
$ dd if=/dev/urandom count=4 bs=1 | od -t d
$RANDOM % 10
8 এবং 9 এর ক্ষেত্রে 0-7 এর তুলনায় 8 এবং 9 পরিমাপযোগ্য (যদিও প্রান্তিক) কম সম্ভাব্য, এমনকি যদি $RANDOM
এলোমেলো তথ্যের একটি শক্তিশালী উত্সও হয়।
$RANDOM
এর পরিসীমা হ'ল 0-32767
সংখ্যা 0
- বিভিন্ন সম্ভাব্য ইনপুটগুলির 7
মানচিত্র 3277
, 8
এবং এবং 9
কেবল 3276
বিভিন্ন উপায়ে তৈরি করা যায় (কারণ 32768
এবং 32769
এটি সম্ভব নয়) n't এটি দ্রুত হ্যাকগুলির জন্য একটি সামান্য সমস্যা, তবে এর অর্থ ফলাফলটি অভিন্নভাবে এলোমেলো নয়। জাভা-র মতো এলোমেলো গ্রন্থাগারগুলি Random
কেবলমাত্র একটি বিভাজনযোগ্য সংখ্যার পরিবর্তনের পরিবর্তে প্রদত্ত পরিসরে একটি অভিন্ন র্যান্ডম সংখ্যাটি যথাযথভাবে ফিরিয়ে দেওয়ার জন্য ফাংশন সরবরাহ করে।
দয়া করে দেখুন $RANDOM
:
$RANDOM
এটি একটি অভ্যন্তরীণ বাশ ফাংশন (ধ্রুবক নয়) যা 0 - 32767 সীমাতে সিউডোরোডম পূর্ণসংখ্যা প্রদান করে It এটি কোনও এনক্রিপশন কী উত্পন্ন করতে ব্যবহার করা উচিত নয়।
32767
কোনো বিশেষ অর্থ রয়েছে?
32767
হ'ল 2^16 / 2 - 1
যা স্বাক্ষরিত 16 বিট পূর্ণসংখ্যার জন্য উপরের সীমা।
2^15 - 1
? এটি সমতুল্য, সুতরাং আমি অনুগ্রহ করে থাকি যদি আমি অনুপস্থিত কিছু প্রসঙ্গ আছে?
আপনি shuf ( কোর্টিলগুলিতে উপলব্ধ) ব্যবহার করতে পারেন ।
shuf -i 1-100000 -n 1
shuf -i 1-10 -n 1: syntax error in expression (error token is "1-10 -n 1")
$var
পরিসর সমাপ্ত পরিবর্তে, এরকম:var=100 && shuf -i 1-${var} -n 1
-n
। উদাহরণস্বরূপ 1 এবং 100 এর মধ্যে 5 এলোমেলো সংখ্যা তৈরি করুন :shuf -i 1-100 -n 5
shuf -i 1-10 -n 10
আপনি 1 থেকে 10 অবধি নির্ভুল এক নম্বর পাবেন। আপনি যদি নির্দিষ্ট করে থাকেন তবে -n 15
ঠিক একবারে কেবল 10 টি নম্বর পাবেন। এটি সত্যিই কেবল বদলানো, এলোমেলো সংখ্যা তৈরি করে না।
আপনার শেল থেকে এটি চেষ্টা করুন:
$ od -A n -t d -N 1 /dev/urandom
এখানে, -t d
নির্দিষ্ট করে যে আউটপুট ফর্ম্যাটটি দশমিক স্বাক্ষর করা উচিত; -N 1
থেকে একটি বাইট পড়তে বলে /dev/urandom
।
od -A n -t d -N 1 /dev/urandom |tr -d ' '
আপনি এওজক থেকে এলোমেলো নম্বর পেতে পারেন
awk 'BEGIN {
# seed
srand()
for (i=1;i<=1000;i++){
print int(1 + rand() * 100)
}
}'
srand()
এর বীজ বর্তমান সিপিইউ সময়। আপনার যদি একটি নির্দিষ্ট বীজ নির্দিষ্ট করতে হয়, যাতে আরএনজি নকল করা যায়, বীজটি srand(x)
কোথায় রয়েছে x
তা ব্যবহার করুন । এছাড়াও, জিএনইউ অ্যাওকের সংখ্যা সংক্রান্ত ফাংশন ম্যানুয়াল থেকে উদ্ধৃত, "বিভিন্ন বিস্তৃত বাস্তবায়ন অভ্যন্তরীণভাবে বিভিন্ন এলোমেলো-সংখ্যা জেনারেটর ব্যবহার করে।" উত্সাহটি হ'ল যদি আপনি পরিসংখ্যান বিতরণ উত্পন্ন করতে আগ্রহী হন তবে আপনার এক রানটাইম থেকে পরের দিকে বিভিন্ন প্ল্যাটফর্মের (সমস্ত চলমান awk
বা gawk
) চলমান কিছুটা পরিবর্তনের আশা করা উচিত ।
$ র্যান্ডম রয়েছে। আমি জানি না এটি কীভাবে কাজ করে। কিন্তু এটি কাজ করে. পরীক্ষার জন্য, আপনি এটি করতে পারেন:
echo $RANDOM
আমি এই কৌশলটি পছন্দ করি:
echo ${RANDOM:0:1} # random number between 1 and 9
echo ${RANDOM:0:2} # random number between 1 and 99
...
${RANDOM:0:1}
আপনাকে 1 বা 2 দেওয়ার 67.6% সুযোগ রয়েছে, ${RANDOM:0:2}
কেবলমাত্র আপনাকে একক সংখ্যা ((1% হওয়া উচিত) দেওয়ার একটি 0.03% সম্ভাবনা রয়েছে এবং উভয়েরই আপনাকে 0 দেওয়ার সুযোগ রয়েছে 0.003% এখনও এটি ব্যবহারের ক্ষেত্রে রয়েছে যেখানে এটি ঠিক আছে (উদাহরণস্বরূপ অ-ধারাবাহিক ইনপুট)।
অন্তর্ভুক্ত সহ 0 এবং 9 এর মধ্যে এলোমেলো সংখ্যা।
echo $((RANDOM%10))
$RANDOM
কেবল 0 থেকে 32767 পর্যন্ত চলে যায় It এটিতে "কয়েকটি উইঙ্গার সহ বেশিরভাগ 1 এবং 3 এর মধ্যে র্যান্ডম সংখ্যার কথা বলা উচিত ছিল";)
আপনি যদি একটি লিনাক্স সিস্টেম ব্যবহার করেন তবে আপনি / dev / এলোমেলো বা / dev / urandom এর মধ্যে একটি এলোমেলো নম্বর পেতে পারেন । সাবধান থাকুন / দেব / এলোমেলোভাবে ব্লক হয়ে যাবে যদি পর্যাপ্ত এলোমেলো সংখ্যা উপলব্ধ না হয়। আপনার যদি এলোমেলোভাবে ব্যবহারের গতি / ডিভ / ইউরেন্ডম প্রয়োজন হয়।
এই "ফাইলগুলি" অপারেটিং সিস্টেম দ্বারা উত্পন্ন এলোমেলো সংখ্যায় পূর্ণ হবে। এটি সত্য বা সিউডো এলোমেলো সংখ্যা পেলে এটি আপনার সিস্টেমে / dev / এলোমেলো প্রয়োগের উপর নির্ভর করে। মাউস, হার্ড ড্রাইভ, নেটওয়ার্কের মতো ডিভাইস ড্রাইভারদের কাছ থেকে সংগৃহীত সাহায্যের ফর্মের শব্দ সহ সত্যই এলোমেলো সংখ্যা তৈরি করা হয়।
আপনি ডিডি সহ ফাইল থেকে এলোমেলো নম্বর পেতে পারেন
আমি এই ধারণাগুলির কয়েকটি নিয়েছি এবং একটি ফাংশন তৈরি করেছি যা প্রচুর এলোমেলো সংখ্যার প্রয়োজন হলে দ্রুত সঞ্চালন করা উচিত।
কলিং od
ব্যয়বহুল যদি আপনার প্রচুর এলোমেলো সংখ্যার প্রয়োজন হয়। পরিবর্তে আমি এটি একবার কল করে এবং / dev / urandom থেকে 1024 এলোমেলো নম্বর সঞ্চয় করি। যখন rand
ডাকা হয়, সর্বশেষ এলোমেলো নম্বরটি ফিরে আসে এবং ছোট করে দেওয়া হয়। এরপরে এটি ক্যাশে থেকে সরানো হয়। যখন ক্যাশেটি খালি থাকে, তখন অন্য 1024 টি এলোমেলো সংখ্যা পড়ে।
উদাহরণ:
rand 10; echo $RET
অন্তর্ভুক্ত সহ 0 থেকে 9 এর মধ্যে আরইটিতে একটি এলোমেলো নম্বর দেয়।
declare -ia RANDCACHE
declare -i RET RAWRAND=$(( (1<<32)-1 ))
function rand(){ # pick a random number from 0 to N-1. Max N is 2^32
local -i N=$1
[[ ${#RANDCACHE[*]} -eq 0 ]] && { RANDCACHE=( $(od -An -tu4 -N1024 /dev/urandom) ); } # refill cache
RET=$(( (RANDCACHE[-1]*N+1)/RAWRAND )) # pull last random number and scale
unset RANDCACHE[${#RANDCACHE[*]}-1] # pop read random number
};
# test by generating a lot of random numbers, then effectively place them in bins and count how many are in each bin.
declare -i c; declare -ia BIN
for (( c=0; c<100000; c++ )); do
rand 10
BIN[RET]+=1 # add to bin to check distribution
done
for (( c=0; c<10; c++ )); do
printf "%d %d\n" $c ${BIN[c]}
done
আপডেট: তা এত ভাল সব এন এছাড়া র্যান্ডম বিট নষ্ট জন্য কাজ করে না তবে ছোট এন লক্ষ করেন, (এই ক্ষেত্রে) একটি 32 বিট র্যান্ডম সংখ্যা সঙ্গে ব্যবহার 0 এবং 9 (10 * মধ্যে 9 র্যান্ডম সংখ্যার জন্য যথেষ্ট এনট্রপি হয়েছে 9 = 1,000,000,000 <= 2 * 32) আমরা প্রতিটি 32 এলোমেলো উত্স মান থেকে একাধিক এলোমেলো সংখ্যা বের করতে পারি।
#!/bin/bash
declare -ia RCACHE
declare -i RET # return value
declare -i ENT=2 # keep track of unused entropy as 2^(entropy)
declare -i RND=RANDOM%ENT # a store for unused entropy - start with 1 bit
declare -i BYTES=4 # size of unsigned random bytes returned by od
declare -i BITS=8*BYTES # size of random data returned by od in bits
declare -i CACHE=16 # number of random numbers to cache
declare -i MAX=2**BITS # quantum of entropy per cached random number
declare -i c
function rand(){ # pick a random number from 0 to 2^BITS-1
[[ ${#RCACHE[*]} -eq 0 ]] && { RCACHE=( $(od -An -tu$BYTES -N$CACHE /dev/urandom) ); } # refill cache - could use /dev/random if CACHE is small
RET=${RCACHE[-1]} # pull last random number and scale
unset RCACHE[${#RCACHE[*]}-1] # pop read random number
};
function randBetween(){
local -i N=$1
[[ ENT -lt N ]] && { # not enough entropy to supply ln(N)/ln(2) bits
rand; RND=RET # get more random bits
ENT=MAX # reset entropy
}
RET=RND%N # random number to return
RND=RND/N # remaining randomness
ENT=ENT/N # remaining entropy
};
declare -ia BIN
for (( c=0; c<100000; c++ )); do
randBetween 10
BIN[RET]+=1
done
for c in ${BIN[*]}; do
echo $c
done
od -An -tu4 -N40 /dev/urandom
হোয়াইটস্পেসের সাথে পৃথক 10 র্যান্ডম স্বাক্ষরযুক্ত 32 বিট পূর্ণসংখ্যার উত্পন্ন করবে। আপনি এটি একটি অ্যারেতে সঞ্চয় করতে পারেন এবং এটি পরে ব্যবহার করতে পারেন। আপনার কোডটি একটি ওভারকিল বলে মনে হচ্ছে।
/ Dev / এলোমেলো বা / dev / ইউরেন্ডম চরিত্রের বিশেষ ফাইলগুলি থেকে পঠন যাওয়ার উপায়।
এই ডিভাইসগুলি যখন পড়া যায় তখন অ্যাপ্লিকেশন সফ্টওয়্যারটিকে এনক্রিপশনের জন্য সুরক্ষিত কীগুলি চয়ন করতে সহায়তা করার জন্য ডিজাইন করা হয় truly এলোমেলো নম্বরগুলি একটি এন্ট্রপি পুল থেকে বের করা হয় যা বিভিন্ন এলোমেলো ইভেন্ট দ্বারা অবদান রাখে। {এলডিডি 3, জোনাথন কর্বেট, আলেসান্দ্রো রুবিনি এবং গ্রেগ ক্রোহ-হার্টম্যান]
এই দুটি ফাইল বিশেষত কার্নেল র্যান্ডমাইজেশনের ইন্টারফেস are
void get_random_bytes_arch(void* buf, int nbytes)
এই জাতীয় ফাংশন যদি হার্ডওয়ার দ্বারা প্রয়োগ করা হয় (সাধারণত হয়), বা এটি এনট্রপি পুল থেকে আসে (যা মাউস এবং কীবোর্ডের বিঘ্ন এবং SASPAMPLE_RANDOM এর সাথে নিবন্ধিত অন্যান্য বিঘ্নিত ইভেন্টগুলির মধ্যে সময় অন্তর্ভুক্ত করে) যা হার্ডওয়্যার থেকে সত্যই র্যান্ডম বাইটগুলি আঁকায়।
dd if=/dev/urandom count=4 bs=1 | od -t d
এটি কাজ করে, তবে স্ট্যান্ডআউট থেকে অপরিবর্তিত আউটপুট লিখেছে dd
। নীচের কমান্ডটি আমার প্রয়োজন ঠিক পূর্ণসংখ্যা দেয়। পাটিগণিতের বিস্তারে প্রদত্ত বিটমাস্ক সামঞ্জস্য করে আমার প্রয়োজনীয় সংখ্যক এলোমেলো বিটও পেতে পারি:
me@mymachine:~/$ x=$(head -c 1 /dev/urandom > tmp && hexdump
-d tmp | head -n 1 | cut -c13-15) && echo $(( 10#$x & 127 ))
হয়তো আমি কিছুটা দেরি করে ফেলেছি, তবে jot
বাশের একটি ব্যাপ্তির মধ্যে একটি এলোমেলো সংখ্যা তৈরি করতে ব্যবহার করার কী আছে ?
jot -r -p 3 1 0 1
এটি -r
3 দশমিক স্থানের নির্ভুলতা ( -p
) সহ একটি এলোমেলো ( ) নম্বর উত্পন্ন করে । এই বিশেষ ক্ষেত্রে, আপনি 0 এবং 1 ( 1 0 1
) এর মধ্যে একটি নম্বর পাবেন । আপনি ক্রমিক তথ্য মুদ্রণ করতে পারেন। ম্যানুয়াল অনুসারে র্যান্ডম সংখ্যার উত্স হ'ল:
যখন কোন বীজ নির্দিষ্ট না করা হয়, এবং এলোমেলো (3) মাধ্যমে যখন কোনও বীজ দেওয়া হয় তখন এলোমেলো সংখ্যাগুলি অর্ক 4 ব্র্যান্ডম (3) এর মাধ্যমে প্রাপ্ত হয়।
@ নেলসন, @ বারুন এবং @ রবার্টের দুর্দান্ত উত্তরের ভিত্তিতে এখানে একটি বাশ স্ক্রিপ্ট যা এলোমেলো সংখ্যা উত্পন্ন করে।
/dev/urandom
যা বাশের অন্তর্নির্মিতের চেয়ে অনেক ভাল$RANDOM
#!/usr/bin/env bash
digits=10
rand=$(od -A n -t d -N 2 /dev/urandom |tr -d ' ')
num=$((rand % 10))
while [ ${#num} -lt $digits ]; do
rand=$(od -A n -t d -N 1 /dev/urandom |tr -d ' ')
num="${num}$((rand % 10))"
done
echo $num
0 থেকে n এর পরিসরে এলোমেলো সংখ্যা তৈরি করুন (16 বিট পূর্ণসংখ্যায় সাইন ইন)। $ RAND ভেরিয়েবলে ফলাফল সেট করা। উদাহরণ স্বরূপ:
#!/bin/bash
random()
{
local range=${1:-1}
RAND=`od -t uI -N 4 /dev/urandom | awk '{print $2}'`
let "RAND=$RAND%($range+1)"
}
n=10
while [ $(( n -=1 )) -ge "0" ]; do
random 500
echo "$RAND"
done
কোনও প্রোগ্রামের এলোমেলো শাখা বা হ্যাঁ / না; 1/0; সত্য / মিথ্যা আউটপুট:
if [ $RANDOM -gt 16383 ]; then # 16383 = 32767/2
echo var=true/1/yes/go_hither
else
echo var=false/0/no/go_thither
fi
যদি আপনি 16383 মনে রাখতে অলস হন:
if (( RANDOM % 2 )); then
echo "yes"
else
echo "no"
fi