র্যান্ডম নম্বর গেমিং, এনক্রিপশন এবং সিমুলেশন বানানোর মতো বিভিন্ন উদ্দেশ্যে উপকারী। টেকনিক্যালি, কম্পিউটারগুলো পিউরলি কম্পিউটেশন দিয়ে র্যান্ডম নম্বর জেনারেট করতে পারে না। যেকোনো ডিটারমিনিস্টিক ডিভাইসে সত্যিকারের র্যান্ডম নম্বর প্রোডিউস করা মৌলিকভাবে অসম্ভব। আপনি আশা করতে পারেন সর্বোচ্চ সুডোর্যান্ডম নম্বর, একটি নম্বর স্ট্রিম যা মনে হয় যেন সেগুলো র্যান্ডমলি জেনারেট করা হয়েছে।
এই আর্টিকেলে, আমরা রুবিতে র্যান্ডম নম্বর জেনারেট করার বিভিন্ন উপায় দেখব।
Kernel#rand দিয়ে র্যান্ডম নম্বর জেনারেট করা
শুরু করি rand মেথড দিয়ে র্যান্ডম নম্বর জেনারেট করে। যখন মেথডটি কোনো আর্গুমেন্ট ছাড়া কল করা হয়, এটি একটি ফ্লোট রিটার্ন করে যা ০.০-এর চেয়ে বড় বা সমান এবং ১.০-এর চেয়ে ছোট।
rand() # > 0.7308136972953823
একটি ইন্টিজার পেতে, আপনি ফাংশনে একটি ইন্টিজার পাস করুন। ফাংশনটি একটি র্যান্ডম ইন্টিজার মান রিটার্ন করবে যা ০-এর চেয়ে বড় বা সমান এবং পাস করা ইন্টিজারের চেয়ে ছোট। প্রতিবার নিচের কোড রান করলে, আপনি ০ এবং ৭-এর মধ্যে একটি নম্বর পাবেন।
rand(8) # > 5
এক নির্দিষ্ট রেঞ্জের মধ্যে র্যান্ডম নম্বর পেতে, rand-এ রেঞ্জ পাস করুন।
নিচের উদাহরণটি একটি ইনক্লूसিভ রেঞ্জ ব্যবহার করে নিচের লিমিট (1) থেকে উপরের লিমিট (10) পর্যন্ত (এবং অন্তর্ভুক্ত করে) র্যান্ডম নম্বর জেনারেট করে।
rand(1..10) # > 6
পরবর্তী উদাহরণটি একটি নন-ইনক্লूसিভ রেঞ্জ ব্যবহার করে নিচের লিমিট থেকে উপরের লিমিট পর্যন্ত (অন্তর্ভুক্ত না করে) র্যান্ডম নম্বর জেনারেট করে।
rand(1...10) # > 9
রেঞ্জ ফ্লোটিং পয়েন্ট ভ্যালুও হতে পারে।
rand(1.5..3.0) # > 1.7494305393711571
আপনি rand-এর সাথে নেগেটিভ রেঞ্জ লিমিটও ব্যবহার করতে পারেন।
rand(-5..-1) # > -5
সিঙ্গেল নেগেটিভ নম্বর পাস করলে আশ্চর্য ফলাফল দিতে পারে, নিচে দেখানো হলো।
rand(-100) # > 94
rand(-0.5) # > 0.7692627344737486
এটি হলো কারণ rand-এ পাস করা একটি আর্গুমেন্ট n এর জন্য, rand ০ থেকে (অন্তর্ভুক্ত না করে) n.to_i.abs পর্যন্ত র্যান্ডম নম্বর রিটার্ন করে। উপরের উদাহরণের জন্য (-100).to_i.abs হলো 100 এবং (-0.5).to_i.abs হলো 0, তাই ফলাফলস্বরূপ র্যান্ডম নম্বর।
rand(0) কল করা rand() কল করার সমান। আপনি ০.০ এবং ১.০ (অন্তর্ভুক্ত না) এর মধ্যে র্যান্ডম নম্বর পাবেন।
Kernel#srand দিয়ে রিপ্রোডাসিবল সিকোয়েন্স জেনারেট করা
র্যান্ডম নম্বর জেনারেট করার পরবর্তী মেথডে যাওয়ার আগে, চলুন প্রথমে srand ফাংশনটি দেখি।
Kernel#srand Kernel#rand-এর জন্য সিড সেট করে। আমরা এটি ব্যবহার করতে পারি প্রোগ্রামের বিভিন্ন রানের মধ্যে র্যান্ডম নম্বরের রিপ্রোডাসিবল সিকোয়েন্স জেনারেট করতে।
এটি কী বোঝায় সেটা বুঝতে, আমাদের প্রথমে বুঝতে হবে র্যান্ডম নম্বর কীভাবে জেনারেট হয়।
একটি সিড থেকে "র্যান্ডম" নম্বর জেনারেট করা
যেমন আগে বলা হয়েছে, কম্পিউটারগুলো পিউরলি কম্পিউটেশন দিয়ে সত্যিকারের র্যান্ডম নম্বর জেনারেট করে না। সেগুলো একটি নম্বর সিকোয়েন্স জেনারেট করে যা র্যান্ডম মনে হয়। এটি করতে, কম্পিউটার একটি সিড নম্বর দিয়ে শুরু করে, যা সেটি কিছু অ্যালগরিদমের মাধ্যমে চালিয়ে একটি যেন র্যান্ডম আউটপুট বের করে।
সিড নম্বরটি কম্পিউটার বিভিন্ন এলিমেন্টের কম্বিনেশন ব্যবহার করে জেনারেট করে, যেমন টাইমস্ট্যাম্প, প্রোগ্রামের প্রসেস আইডি, ইত্যাদি। যেহেতু এই এলিমেন্টগুলো র্যান্ডম নম্বর জেনারেট করার প্রতিটি রিকোয়েস্টের জন্য ভিন্ন হয়, সিড নম্বরটিও সবসময় ভিন্ন হবে, যা একটি ভিন্ন সিকোয়েন্স প্রোডিউস করবে, ফলে র্যান্ডম নম্বর আউটপুট। যদি আপনি একই সিডের সাথে অ্যালগরিদম চালান, তাহলে আপনি প্রতিবার একই সিকোয়েন্স পাবেন। এটাই Kernel#srand আমাদের করতে দেয়।
srand সাধারণত টেস্টিং-এ ব্যবহৃত হয়। এটি আপনার অ্যাপে র্যান্ডমনেস ডিল করা কোড টেস্ট করার জন্য হ্যান্ডি হতে পারে, এমন মানসহ যা র্যান্ডম কিন্তু প্রিডিক্টেবল যতটুকু টেস্ট করার জন্য। এটি বাগ আইসোলেট বা রিপ্রোডিউস করতে সাহায্য করতে পারে।
নিচে আমরা srand ব্যবহার করি সিড সেট করতে এবং তারপর rand কল করি প্রথমে কয়েকটি আলাদা র্যান্ডম নম্বর এবং তারপর কয়েকটি র্যান্ডম নম্বর সিকোয়েন্স প্রোডিউস করতে।
srand(777)
rand() # > 0.152663734901322
rand() # > 0.3023566097075212
10.times.map { rand(10) } # > [7, 1, 7, 4, 7, 9, 8, 7, 2, 0]
10.times.map { rand(10) } # > [1, 2, 4, 5, 7, 1, 7, 2, 2, 7]
আপনি যদি আবার একই সিডের সাথে srand রান করুন এবং আগের মতো একই কলগুলো করুন, আপনি দেখবেন আমরা একই র্যান্ডম নম্বর পাচ্ছি।
srand(777)
rand() # > 0.152663734901322
rand() # > 0.3023566097075212
10.times.map { rand(10) } # > [7, 1, 7, 4, 7, 9, 8, 7, 2, 0]
10.times.map { rand(10) } # > [1, 2, 4, 5, 7, 1, 7, 2, 2, 7]
Random দিয়ে র্যান্ডম নম্বর জেনারেট করা
আপনি Random ক্লাস দিয়েও র্যান্ডম নম্বর জেনারেট করতে পারেন।
ক্লাস মেথড rand Kernel#rand-এর বেস ফাংশনালিটি প্রদান করে ফ্লোটিং পয়েন্ট ভ্যালু হ্যান্ডলিং millor সহ।
Random.rand(1...10) # > 5
Kernel#rand-এর বিপরীতে, যদি Random.rand-কে নেগেটিভ বা 0 আর্গুমেন্ট দেয়া হয়, এটি একটি ArgumentError রেইজ করে।
নরমাল ডিস্ট্রিবিউশন ভিত্তিক র্যান্ডম নম্বর জেনারেট করা
বাস্তব জগতে, অনেক জিনিস নরমাল ডিস্ট্রিবিউশন ফলো করে। যদি আপনার একটি ভ্যালু রেঞ্জ থাকে যেটি কোনো কিছুর অধীনে পড়ে, কদাচিৎই আপনি সব ভ্যালুর সমান ডিস্ট্রিবিউশন পাবেন। অধিকাংশसमয়, ডেটার অধিকাংশ ছোট একটি রেঞ্জের মধ্যে পড়ে, একটি ছোট পার্সেন্টেজ বড় রেঞ্জের মধ্যে পড়ে। একটি প্রাপ্তবয়স্ক পুরুষের হাইটকে উদাহরণ হিসেবে নিই। রেকর্ড করা সবচেয়ে ছোট হাইট ৫৪.৬ সেমি (২১.৫ ইঞ্চি) যখন সাবচেয়ে লম্বা ২৬৭ সেমি (৮'৯")। আপনি যদি একটি পপুলেশনে পুরুষদের হাইট সিমুলেট করার জন্য ডেটা জেনারেট করতে চান, আপনি এই লিমিটসহ rand ব্যবহার করতে চাইতে পারেন না। আপনি ৮'৯" পুরুষ পাওয়ার প্রোব্যাবিলিটি ৬' পুরুষ পাওয়ার মতই হোনা চান না, কারণ Последнееটি বেশি সাধারণ।
নরমাল ডিস্ট্রিবিউশন ফলো করা অন্যান্য জিনিসের উদাহরণ:
- মেজারমেন্টে এরর
- ব্লড প্রেশার
- টেস্ট স্কোর
- প্রাপ্তবয়স্ক পুরুষ/মহিলার ওজন
সেরকম ইউজ কেসের জন্য ভালো র্যান্ডম নম্বর জেনারেট করতে, আপনি rubystats জেম ব্যবহার করতে পারেন।
$ gem install rubystats
require 'rubystats'
adult_male_height = Rubystats::NormalDistribution.new(178, 10)
sample = 50.times.map { adult_male_height.rng.round(1) }
# > [183.2, 169.5, 189.7, 171.9, 176.0, 179.3, 189.3, 175.3, 188.3, 190.0, 185.5, 182.8, 187.2, 191.6, 185.4, 178.4, 187.1, 183.3, 189.6, 179.7, 172.7, 174.4, 153.8, 197.4, 176.0, 174.6, 181.1, 182.0, 204.7, 185.2, 175.9, 167.7, 160.6, 170.5, 169.3, 160.6, 165.6, 166.4, 182.6, 179.7, 183.1, 171.9, 185.4, 175.4, 179.7, 176.9, 160.6, 173.8, 181.9, 190.2]
উপরে, আমরা পুরুষদের গড় হাইট (১৭৮ সেমি) এবং ১০ সেমি স্ট্যান্ডার্ড ডেভিয়েশন NormalDistribution.new-এ পাস করলাম, ৫০টি মান জেনারেট করার আগে যা এই নরমাল ডিস্ট্রিবিউশনে পড়ে। আপনি যদি ম্যাথ সম্পর্কে কিউরিয়াস হন, এই আর্টিকেল আপনাকে আকর্ষণ করতে পারে।
র্যান্ডম রাউন্ডআপ
এটি আমাদের এই আলোচনার শেষে আনে। আমরা রুবিতে 'র্যান্ডম' নম্বর তৈরি করার কয়েকটি ভিন্ন উপায় কভার করলাম, rand, srand, Random এবং Rubystats দিয়ে। আমরা কীভাবে 'র্যান্ডম' নম্বর তৈরি হয় সেটাও সংক্ষেপে ছোঁয়েছি এবং ডিটারমিনিস্টিক ডিভাইস কেন রিয়েল র্যান্ডম নম্বর তৈরি করতে পারে না সেটাও দেখেছি।
আপনাকে মনে রাখা উচিত যে কভার করা মেথডগুলো সব ইউজ কেসের জন্য আइডিয়াল নয় যারা র্যান্ডমনেস ডিমান্ড করে। মেথডগুলো দ্বারা জেনারেটেড ইন্টিজার বা ফ্লোটিং পয়েন্ট নম্বর গেমিং-এ চান্স প্রোডিউস করতে বা সিমুলেশন তৈরি করতে আইডিয়াল হতে পারে, কিন্তু যেসব সিচুয়েশনে কিছু সিকিউরিটি ডিমান্ড করে, উদাহরণস্বরূপ পাসওয়ার্ড রিসেট টোকেন জেনারেট করার সময়, আপনাকে SecureRandom ব্যবহার করার কথা বিবেচনা করা উচিত। SecureRandom-এর সাথে, আপনি হেক্সাডেসিমেল, বেস৬৪, বাইনারি এবং UUID স্ট্রিং জেনারেট করতে পারেন যা সাদা নম্বরের চেয়ে অনেক কঠিন ব্রেক করা।
আমরা আশা করি আপনি এর কিছু আকর্ষণীয় পেয়েছেন। আপনার যদি আমাদের কভার করা বিষয়ে কোনো মন্তব্য বা প্রশ্ন থাকে, @AppSignal-এ আমাদের পৌঁছান। আপনি আমাদের কভার করতে চান এমন টপিকের রিকোয়েস্টও পাঠাতে পারেন।
আমরা এই আর্টিকেলটি আগস্ট ১, ২০১৮-এ আপডেট করেছি SecureRandom-র ऊपर একটি নোট অন্তর্ভুক্ত করার জন্য