নির্দিষ্ট পরিসরে এলোমেলো সংখ্যা তৈরি করুন


84

কিছুটা গুগল করার পরে আমি একটি নির্দিষ্ট পরিসরে অন্তর্ভুক্ত একটি এলোমেলো দশমিক পূর্ণসংখ্যার সংখ্যা উত্পন্ন করতে শেল কমান্ডটি ব্যবহার করার সহজ উপায় খুঁজে পেলাম না, এটি সর্বনিম্ন এবং সর্বোচ্চের মধ্যে।

আমি সম্পর্কে পড়েছি /dev/random, /dev/urandomএবং $RANDOM, তবে এর মধ্যে আমার যা প্রয়োজন তা করতে পারে না।

অন্য উপকারী কমান্ড, বা পূর্ববর্তী ডেটা ব্যবহার করার উপায় আছে?


2
এই SO প্রশ্নোত্তর দেখুন: stackoverflow.com/questions/8988824/… পাশাপাশি এই স্ট্যাকওভারফ্লো . com / প্রশ্নগুলি / 2556190/…
slm

সম্ভবত সম্পর্কিত: unix.stackexchange.com/questions/42045/random-number-needed/...
SLM

সম্পর্কিত: unix.stackexchange.com/questions/124478/...
SLM

উত্তর:


45

পসিক্স টুলসেষ্টে আপনি ব্যবহার করতে পারেন awk:

awk -v min=5 -v max=10 'BEGIN{srand(); print int(min+rand()*(max-min+1))}'

উদাহরণস্বরূপ পাসওয়ার্ড বা গোপন তথ্য তৈরি করার উত্স হিসাবে এটি ব্যবহার করবেন না , বেশিরভাগ awkবাস্তবায়নের মতোই , কমান্ডটি চালানোর সময়টির ভিত্তিতে সংখ্যাটি সহজেই অনুমান করা যায়।

অনেকগুলি awkবাস্তবায়ন সহ, একই কমান্ডের মধ্যে দু'বার চালিত কমান্ডটি আপনাকে একই আউটপুট দেয়।


1
+1 .. যেমন কোনও স্ক্রিপ্টে কোনও চলককে আউটপুট বরাদ্দ করতে ব্যবহৃত হয় (ডাব্লু / ও একটি নতুন লাইনের চরিত্র প্রবর্তন এবং দুটি জায়গার জন্য শূন্য প্যাডিং ব্যবহার করে):x=$(awk -v min=$min_var -v max=$max_var 'BEGIN{srand(); printf("%.2d", int(min+rand()*(max-min+1)))}')
ক্রিস্টোফার

এটি সময়ের ভিত্তিতে? যেহেতু আমি
টানা

@ শাইআলন বর্তমান সময় প্রায়শই শ্রান্ড () এর জন্য ডিফল্ট বীজ মান হিসাবে ব্যবহৃত হয় তাই সাধারণত, হ্যাঁ এটি সময়ের উপর ভিত্তি করে স্টাফেনের উত্তর সম্পর্কে তার বাক্যটি দেখুন। প্রাথমিক বীজটিকে একটি এলোমেলো সংখ্যায় পরিবর্তনের মাধ্যমে আপনি এটি পেতে পারেন awk -v min=5 -v max=10 -v seed="$(od -An -N4 -tu4 /dev/urandom)" 'BEGIN{srand(seed+0); print int(min+rand()*(max-min+1))}'। আপনি এর $RANDOMপরিবর্তে ব্যবহার করতে পারেন od ... /dev/randomতবে তারপরে আপনার বীজের মান তুলনামূলকভাবে ছোট থেকে 0 থেকে 32767 এর মধ্যে রয়েছে এবং তাই আপনি সময়ের সাথে সাথে সম্ভবত আপনার আউটপুটে লক্ষণীয় পুনরাবৃত্তি পাবেন।
এড মর্টন

141

আপনি shufজিএনইউ কোর্টিল থেকে চেষ্টা করতে পারেন :

shuf -i 1-100 -n 1

এটি ব্যাসিবক্সের সাথেও কাজ করে shuf
cov

রাস্পবিয়ান এবং গিটব্যাশ-এও কাজ করে।
nPcomp

30

লেশ

বাসদ এবং ওএসএক্স উপর আপনি ব্যবহার করতে পারেন Jot একটি একক র্যান্ডম (ফিরে আসার -rব্যবধান থেকে) সংখ্যা minথেকে max, সমেত।

$ min=5
$ max=10
$ jot -r 1 $min $max

বিতরণ সমস্যা

দুর্ভাগ্যক্রমে, এলোমেলোভাবে উত্পন্ন সংখ্যার পরিসীমা এবং বন্টন এই প্রভাব দ্বারা প্রভাবিত হয় যে জট অভ্যন্তরীণভাবে ডাবল স্পেসিচনের ফ্লোটিং পয়েন্ট এবং আউটপুট ফরম্যাটের জন্য প্রিন্টফ (3) ব্যবহার করে, যা গোলাকার এবং কাটা সমস্যার কারণ হয়ে থাকে। অতএব, অন্তর এর প্রদর্শিত minএবং maxপ্রদর্শিত হিসাবে কম ঘন উত্পাদিত হয়:

$ jot -r 100000 5 10 | sort -n | uniq -c
9918  5
20176 6
20006 7
20083 8
19879 9
9938  10

ওএস এক্স 10.11 (এল ক্যাপিটান) এ এটি স্থির হয়েছে বলে মনে হচ্ছে:

$ jot -r 100000 5 10 | sort -n | uniq -c
16692 5
16550 6
16856 7
16579 8
16714 9
16609 10  

এবং...

$ jot -r 1000000 1 10 | sort -n | uniq -c
100430 1
99965 2
99982 3
99796 4
100444 5
99853 6
99835 7
100397 8
99588 9
99710 10

বিতরণ সমস্যা সমাধান

ওএস এক্স এর পুরানো সংস্করণগুলির জন্য, সৌভাগ্যক্রমে বেশ কয়েকটি কর্মক্ষেত্র রয়েছে। একটি হ'ল প্রিন্টফ (3) সংখ্যার রূপান্তর ব্যবহার করা। একমাত্র সতর্কতা হ'ল ব্যবধানটি সর্বাধিক হয়ে যায় max+1। পূর্ণসংখ্যা বিন্যাস ব্যবহার করে, আমরা পুরো বিরতিতে ন্যায্য বিতরণ পাই:

$ jot -w %i -r 100000 5 11 | sort -n | uniq -c
16756 5
16571 6
16744 7
16605 8
16683 9
16641 10

নিখুঁত সমাধান

পরিশেষে, কাজের দিকটি ব্যবহার করে পাশের ফর্সা রোল পেতে, আমাদের কাছে রয়েছে:

$ min=5
$ max_plus1=11  # 10 + 1
$ jot -w %i -r 1 $min $max_plus1

অতিরিক্ত বাড়ির কাজ

দেখুন Jot (1) রক্তাক্ত গণিত এবং ফর্ম্যাটিং বিস্তারিত এবং আরো অনেক উদাহরণ জন্য।


15

$RANDOMপরিবর্তনশীল স্বাভাবিকভাবে উত্পন্ন ভাল র্যান্ডম মান একটি ভালো উপায় নয়। /dev/[u]randomপ্রয়োজনের আউটপুটটিকেও প্রথমে রূপান্তর করতে হবে।

একটি সহজ উপায় হ'ল উচ্চ স্তরের ভাষা ব্যবহার করা, যেমন অজগর:

5 এবং 10 (5 <= N <= 10) এর মধ্যে একটি এলোমেলো পূর্ণসংখ্যের ভেরিয়েবল তৈরি করতে, ব্যবহার করুন

python -c "import random; print random.randint(5,10)"

ক্রিপ্টোগ্রাফিক অ্যাপ্লিকেশনগুলির জন্য এটি ব্যবহার করবেন না।


এটি দরকারী ছিল। আপনাকে অনেক ধন্যবাদ :) স্বাক্ষরিত হিসাবে প্রায়শই ইউনিক্স-> সোলারিস 10 এর সাথে কাজ করেছে জিএনইউ ব্যবহারগুলি ডিফল্টরূপে সংহত হয় না। এটি তবে কাজ করে।
উত্তম

11

এর মাধ্যমে আপনি এলোমেলো নম্বর পেতে পারেন urandom

head -200 /dev/urandom | cksum

আউটপুট:

3310670062 52870

উপরের সংখ্যাটির একটি অংশ পুনরুদ্ধার করতে।

head -200 /dev/urandom | cksum | cut -f1 -d " "

তারপরে আউটপুট হয়

3310670062


head -200(বা এর পসিক্স সমতুল্য head -n 100) প্রথম 200 টি লাইন প্রদান করে /dev/urandom/dev/urandomকোনও পাঠ্য ফাইল নয়, সেই কমান্ডটি 200 বাইট (সমস্ত 0x0a বেশী, ASCII এ এলএফ) থেকে অনন্ততায় ফিরে আসতে পারে (যদি 0xa বাইট কখনও না ফেরানো হয়) তবে 45k এবং 55k এর মধ্যে মানগুলি সম্ভবত সবচেয়ে বেশি হয়। cksum একটি 32 বিট নম্বর দেয়, তাই 4 টি বাইটের বেশি পাওয়ার জন্য অর্থহীন /dev/urandom
স্টাফেন চেজেলাস

7

5 এবং 10 (উভয় সহ) এর মধ্যে একটি এলোমেলো পূর্ণসংখ্যের ভেরিয়েবল তৈরি করতে, ব্যবহার করুন

echo $(( RANDOM % (10 - 5 + 1 ) + 5 ))

% একটি মডুলো অপারেটর হিসাবে কাজ করে।

এলোমেলো ভেরিয়েবলকে $RANDOMএকটি নির্দিষ্ট পরিসরে রূপান্তর করার সম্ভবত আরও ভাল উপায় আছে । এটি ক্রিপ্টোগ্রাফিক অ্যাপ্লিকেশনগুলির জন্য ব্যবহার করবেন না বা ক্ষেত্রে আপনার বাস্তব, সমান-বিতরণযোগ্য এলোমেলো ভেরিয়েবলগুলি (সিমুলেশনের মতো) প্রয়োজন।


3
Shell র্যান্ডম (বিশেষত পুরানোগুলি, বিশেষত বাশ) রয়েছে এমন অনেকগুলি শেল বাস্তবায়নে এটি খুব এলোমেলো নয়। বেশিরভাগ শেলগুলিতে, সংখ্যাটি 0 থেকে 65535 এর মধ্যে থাকে, সুতরাং যে প্রস্থের প্রস্থ দুটি নয়, এমন কোনও ব্যাপ্তির সম্ভাবনা বন্টনের স্বতন্ত্রতা থাকতে পারে। (এই ক্ষেত্রে, 5 থেকে 8 নম্বরগুলির 10923/65536 এর সম্ভাবনা থাকবে, যখন 9 এবং 10 এর 10922/65536 এর সম্ভাবনা থাকবে)। বিস্তৃতি যত বিস্তৃত হবে ততই তাত্পর্যপূর্ণ।
স্টাফেন চেজেলাস

দুঃখিত, এটি 32767 65535 নয়, সুতরাং উপরের গণনাটি ভুল (এবং এটি আসলে আরও খারাপ)।
স্টাফেন চেজেলাস


5

# echo $(( $RANDOM % 256 )) আধুনিক * sh উপভাষায় 0-255 এর মধ্যে একটি "এলোমেলো" সংখ্যা উত্পন্ন করবে।


2 বছর আগে থেকে এই অন্যান্য উত্তরের অনুরূপ ।
জেফ শ্যাচলার

1
এটি কবুতরের সমস্যা (টিএল; ডিআর: কিছু ফলাফল অন্যের তুলনায় বেশি হওয়ার সম্ভাবনা রয়েছে) এর অধীন , যদি 256 এর পরিবর্তে আপনি এমন একটি মান ব্যবহার করেন যা 32768 কে সমানভাবে বিভক্ত করে না।
toon81

4

হতে পারে UUID(লিনাক্সে) এলোমেলো নম্বর পুনরুদ্ধার করতে ব্যবহার করা যেতে পারে

$ cat /proc/sys/kernel/random/uuid
cdd52826-327d-4355-9737-895f58ad11b4

70এবং এর মধ্যে এলোমেলো নম্বর পেতে100

POSIXLY_CORRECT=1 awk -F - '{print(("0x"$1) % 30 + 70)}
   ' /proc/sys/kernel/random/uuid

3
cat /dev/urandom | tr -dc 'a-fA-F0-9' | fold -w 8 | head -n 1

এটি একটি 8 অঙ্কের দীর্ঘ হেক্সাডেসিমাল সংখ্যা উত্পন্ন করবে।


1

সম্পূর্ণভাবে ব্যাশের মধ্যে থাকতে এবং To RANDOM ভেরিয়েবলটি ব্যবহার করতে তবে অসম বন্টন এড়াতে:

#!/bin/bash
range=10 
floor=20

if [ $range -gt 32768 ]; then
echo 'range outside of what $RANDOM can provide.' >&2
exit 1 # exit before entering infinite loop
fi 

max_RANDOM=$(( 2**15/$range*$range ))
r=$RANDOM
until [ $r -lt $max_RANDOM ]; do
r=$RANDOM
done
echo $(( r % $range + $floor ))

এই উদাহরণটি 20 থেকে 29 পর্যন্ত এলোমেলো সংখ্যা সরবরাহ করবে।


$r[: -lt: unary operator expectedত্রুটি এড়াতে 65535 বা অন্যান্য উচ্চ মানের থেকে শুরু করা উচিত ।
লরেন্সসি

লুপ পরীক্ষার আগে initial r সূচনা সংশোধন করে। ধন্যবাদ @ লাওরেন্স সি!
অ্যাঞ্জেল থেকে

0

বিতরণ ভাল:

((i = 1; i <= 100000; i ++)) এর প্রতিধ্বনি (((RANDOM% (20 - 10 + 1) + 10%)) এর জন্য; সম্পন্ন | সাজানো-এন | uniq -c

গণনা মান

9183 10

9109 11

8915 12

9037 13

9100 14

9138 15

9125 16

9261 17

9088 18

8996 19

9048 20

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.