কম্পিউটার

রুবিতে র্যান্ডম সংখ্যা তৈরি করা হচ্ছে

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

এই নিবন্ধে, আমরা বিভিন্ন উপায়ে দেখব যে আপনি রুবিতে র্যান্ডম সংখ্যা তৈরি করতে পারেন৷

Kernel#rand দিয়ে এলোমেলো সংখ্যা তৈরি করা

শুরু করতে, চলুন rand দিয়ে র্যান্ডম সংখ্যা তৈরি করি পদ্ধতি যখন পদ্ধতিটিকে কোন যুক্তি ছাড়াই কল করা হয়, তখন এটি একটি ফ্লোট প্রদান করে যা 0.0 এর চেয়ে বড় বা সমান এবং 1.0 এর কম।

rand()
> 0.7308136972953823

একটি পূর্ণসংখ্যা পেতে, আপনি ফাংশনে একটি পূর্ণসংখ্যা পাস করুন। ফাংশনটি একটি এলোমেলো পূর্ণসংখ্যার মান প্রদান করবে যা 0 এর থেকে বেশি বা সমান এবং ফাংশনে পাস করা পূর্ণসংখ্যার চেয়ে কম। প্রতিবার নিম্নলিখিতটি চালানো হলে, আপনি 0 থেকে 7 এর মধ্যে একটি সংখ্যা পাবেন।

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

এটি একটি যুক্তি n এর জন্য rand এ পাস করা হয়েছে , rand 0 থেকে র্যান্ডম সংখ্যা ফেরত দেয় (কিন্তু অন্তর্ভুক্ত নয়) n.to_i.abs . উপরের উদাহরণের জন্য (-100).to_i.abs হল 100 এবং (-0.5).to_i.abs হল 0 , ফলে র্যান্ডম সংখ্যা।

rand(0) কল করা হচ্ছে rand() কল করার অনুরূপ . আপনি 0.0 এবং 1.0 এর মধ্যে এলোমেলো সংখ্যা পাবেন (অন্তর্ভুক্ত নয়)।

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]

র্যান্ডম সহ র্যান্ডম সংখ্যা তৈরি করা

আপনি র্যান্ডম ক্লাসের সাথে এলোমেলো সংখ্যাও তৈরি করতে পারেন।

ক্লাস পদ্ধতি rand Kernel#rand এর বেস কার্যকারিতা প্রদান করে ফ্লোটিং পয়েন্ট মানগুলির আরও ভাল পরিচালনার সাথে।

Random.rand(1...10)
> 5

Kernel#rand থেকে ভিন্ন , যদি Random.rand একটি নেতিবাচক বা 0 দেওয়া হয় যুক্তি, এটি একটি আর্গুমেন্ট ত্রুটি উত্থাপন করে।

সাধারণ বন্টনের উপর ভিত্তি করে এলোমেলো সংখ্যা তৈরি করা

বাস্তব জগতে, অনেক কিছু একটি সাধারণ বন্টন অনুসরণ করে। আপনার যদি এমন মানগুলির একটি পরিসর থাকে যা কিছুর অধীনে পড়ে, খুব কমই আপনি সমস্ত মানগুলির সমান বন্টন পান। বেশিরভাগই, বেশিরভাগ ডেটা একটি ছোট পরিসরের মধ্যে পড়ে, একটি ছোট শতাংশ বড় পরিসরের মধ্যে পড়ে। উদাহরণ হিসেবে একজন প্রাপ্তবয়স্ক মানুষের উচ্চতা ধরা যাক। রেকর্ড করা সংক্ষিপ্ত উচ্চতা হল 54.6 সেমি (21.5 ইঞ্চি) যেখানে সবচেয়ে লম্বাটি হল 267 সেমি (8'9")। আপনি যদি কোনো জনসংখ্যার পুরুষদের উচ্চতা অনুকরণ করার জন্য ডেটা তৈরি করতে চান, তাহলে আপনি rand এই সীমার সাথে। আপনি চান না যে একজন 8'9" মানুষ পাওয়ার সম্ভাবনা একজন 6' মানুষ পাওয়ার সমান হোক, কারণ পরবর্তীটি আরও সাধারণ।

একটি সাধারণ বন্টন অনুসরণ করে এমন অন্যান্য উদাহরণ হল:

  • পরিমাপে ত্রুটি
  • রক্তচাপ
  • টেস্ট স্কোর
  • একজন প্রাপ্তবয়স্ক পুরুষ/মহিলার ওজন

এই ধরনের ব্যবহারের ক্ষেত্রে আরও ভাল র্যান্ডম সংখ্যা তৈরি করতে, আপনি 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]

উপরে, আমরা পুরুষদের গড় উচ্চতা (178 সেমি) এবং 10 সেন্টিমিটারের একটি আদর্শ বিচ্যুতি NormalDistribution.new পাস করি , 50টি মান তৈরি করার আগে যা এই স্বাভাবিক বিতরণে পড়ে। আপনি যদি গণিত সম্পর্কে কৌতূহলী হন, তাহলে এই নিবন্ধটি আপনার জন্য আগ্রহী হতে পারে।

এলোমেলো রাউন্ডআপ

এটি আমাদের এই আলোচনার শেষে নিয়ে আসে। আমরা rand দিয়ে রুবিতে 'র্যান্ডম' সংখ্যা তৈরি করার কয়েকটি ভিন্ন উপায় কভার করেছি , srand , Random এবং rubystats . আমরা সংক্ষিপ্তভাবে 'এলোমেলো' সংখ্যাগুলি কীভাবে তৈরি করা হয় তাও স্পর্শ করেছি এবং কেন নির্ধারক ডিভাইসগুলি প্রকৃত র্যান্ডম সংখ্যা তৈরি করতে পারে না তার কারণটি দেখেছি৷

আপনার মনে রাখা উচিত যে আচ্ছাদিত পদ্ধতিগুলি সমস্ত ব্যবহারের ক্ষেত্রে আদর্শ নয় যা এলোমেলোতার জন্য কল করে। পদ্ধতিগুলি দ্বারা উত্পন্ন পূর্ণসংখ্যা বা ফ্লোটিং পয়েন্ট নম্বরগুলি গেমিং বা সিমুলেশন তৈরির সুযোগ তৈরির জন্য আদর্শ হতে পারে, তবে এমন পরিস্থিতিতে যা কিছু নিরাপত্তার প্রয়োজন, উদাহরণস্বরূপ একটি পাসওয়ার্ড রিসেট টোকেন তৈরি করার সময়, আপনার SecureRandom ব্যবহার করার কথা বিবেচনা করা উচিত৷ SecureRandom সহ , আপনি হেক্সাডেসিমাল, বেস64, বাইনারি এবং UUID স্ট্রিং তৈরি করতে পারেন যা প্লেইন সংখ্যার তুলনায় ক্র্যাক করা অনেক কঠিন।

আমরা আশা করি আপনি এই আকর্ষণীয় কিছু খুঁজে পেয়েছেন. আমরা যা কভার করেছি সে সম্পর্কে আপনার যদি কোনো মন্তব্য বা প্রশ্ন থাকে, অনুগ্রহ করে আমাদের সাথে যোগাযোগ করুন @AppSignal। আপনি কভার করতে চান এমন বিষয়গুলির জন্য আপনার অনুরোধগুলিও আমাদের পাঠাতে পারেন৷

আমরা SecureRandom-এ একটি নোট অন্তর্ভুক্ত করতে 1লা আগস্ট, 2018-এ এই নিবন্ধটি আপডেট করেছি


  1. পাইথনে UUID ব্যবহার করে র্যান্ডম আইডি তৈরি করা হচ্ছে

  2. পাইথনে এলোমেলো সংখ্যা

  3. কিভাবে ওয়েটেড র্যান্ডম নম্বর তৈরি করবেন

  4. রুবিতে কীভাবে র্যান্ডম নম্বর এবং স্ট্রিং তৈরি করবেন