র‍্যান্ডম নম্বর জেনারেটর কী?

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

হার্ডওয়্যার র‍্যান্ডম নম্বর জেনারেটর

একটি হার্ডওয়্যার র‍্যান্ডম নম্বর জেনারেটর (HRNG), যাকে ট্রু বা প্রকৃত র‍্যান্ডম নম্বর জেনারেটরও (TRNG) বলা হয়, ভৌত প্রক্রিয়া থেকে সংখ্যা সংগ্রহ করে। এর প্রাচীন উদাহরণগুলো চোখের সামনেই পর্যবেক্ষণ করা যায়: টস করা কয়েন, গড়িয়ে দেওয়া ছক্কা কিংবা রুলেট চাকা। বলবিদ্যার সাহায্যে এদের প্রতিটি প্রক্রিয়া সম্পূর্ণভাবে ব্যাখ্যা করা সম্ভব, তবুও বাস্তবে একটি নিখুঁত চাকা অনির্দেশ্যই থেকে যায়, কারণ প্রতিটি ঘূর্ণনের শুরুর অতি ক্ষুদ্র পার্থক্য পরিণামে সম্পূর্ণ ভিন্ন ফল এনে দেয়।

আধুনিক হার্ডওয়্যার জেনারেটরগুলো এর পরিবর্তে আণুবীক্ষণিক ঘটনা পরিমাপ করে: ইলেকট্রনিক সার্কিটের শট নয়েজ ও থার্মাল নয়েজ, বায়ুমণ্ডলীয় নয়েজ এবং কোয়ান্টাম প্রভাব। এগুলো এন্ট্রপির চমৎকার উৎস — অনির্দেশ্যতার এমন এক মাত্রা যা পরিমাপ করা যায় — তবে কোনো ভৌত উৎসই স্বভাবগতভাবে নিখুঁত নয়: এটি পক্ষপাতদুষ্ট (biased) হতে পারে, সময়ের সাথে পরিবর্তিত হতে পারে কিংবা পুরোপুরি ব্যর্থ হতে পারে। তাই এর গুণমান মূল্যায়ন ও পর্যবেক্ষণ করতে হয় এবং প্রয়োজনবোধে এর প্রাপ্ত মানগুলো প্রক্রিয়াজাত করতে হয়, যেমনটি NIST SP 800-90B-এর মতো মানে বিস্তারিত বলা হয়েছে। হার্ডওয়্যার উৎস মূলত সেখানেই ব্যবহৃত হয় যেখানে নির্ভরযোগ্যতার সবচেয়ে বেশি প্রয়োজন — বিশেষ করে ক্রিপ্টোগ্রাফিতে, যেখানে এগুলো ট্রান্সপোর্ট লেয়ার সিকিউরিটির (TLS) মতো প্রোটোকলের চাবি তৈরির জন্য অনির্দেশ্য প্রাথমিক উপাদান সরবরাহ করে।

সিউডোর‍্যান্ডম নম্বর জেনারেটর

ভৌত যন্ত্রপাতির বিকল্প হলো অ্যালগরিদম। একটি সিউডোর‍্যান্ডম নম্বর জেনারেটর (PRNG) এমন একটি ধারা তৈরি করে যা দেখতে এলোমেলো হলেও তা সীড (seed) নামক একটি প্রাথমিক মানের ওপর সম্পূর্ণ নির্ভরশীল। একই অ্যালগরিদমে একই সীড দিলে আপনি প্রতিবার হুবহু একই ধারা পাবেন। ফলাফল অনির্দেশ্য হওয়া যেখানে বাধ্যতামূলক এবং যেখানে সীড বা অভ্যন্তরীণ অবস্থা অনুমান বা পুনর্গঠন করা সম্ভব, সেখানে এটি একটি দুর্বলতা; তবে ফলাফল পুনরায় যাচাইযোগ্য হওয়া যেখানে প্রয়োজন — যেমন কোনো সিমুলেশন বা পরীক্ষা হুবহু পুনরাবৃত্তি করতে — সেখানে এটি একটি বিরাট সুবিধা। এছাড়া PRNG দ্রুতগতির, সাশ্রয়ী এবং সহজেই বাস্তবায়নযোগ্য, যার কারণে বেশিরভাগ সফটওয়্যার এগুলোর ওপর নির্ভর করে। সুপরিচিত অ্যালগরিদমের মধ্যে রয়েছে লিনিয়ার কনগ্রুয়েনশিয়াল জেনারেটর (LCG), xorshift জেনারেটর এবং মেরসেন টুইস্টার (Mersenne Twister)।

মেরসেন টুইস্টার (Mersenne Twister)

1997 সালে মাকোতো মাতসুমোতো এবং তাকুজি নিশিমুরা কর্তৃক প্রকাশিত Mersenne Twister হলো সর্বাধিক ব্যবহৃত সিউডোর‍্যান্ডম নম্বর জেনারেটরগুলোর একটি এবং বহু প্রোগ্রামিং ভাষার ডিফল্ট ব্যবস্থা। এর নামকরণ করা হয়েছে এর পর্যায়কাল থেকে — যে দৈর্ঘ্যের পর ধারাটির পুনরাবৃত্তি ঘটে — যা প্রমিত সংস্করণ MT19937-এ হলো মেরসেন মৌলিক সংখ্যা 219937 − 1। এটি র‍্যান্ডমনেসের বেশিরভাগ পরিসংখ্যানগত পরীক্ষায় উত্তীর্ণ হয় এবং সিমুলেশনের জন্য দারুণ উপযোগী। তবে এটি গোপনীয়তা রক্ষার উদ্দেশ্যে তৈরি করা হয়নি: পরপর 624 টি 32-বিট ফলাফল থেকে যে কেউ এর অভ্যন্তরীণ অবস্থা পুনর্গঠন করতে পারে এবং পরবর্তী প্রতিটি মান নির্ভুলভাবে বলে দিতে পারে। তাই নিরাপত্তা চাবি, পাসওয়ার্ড কিংবা যেকোনো অনির্দেশ্য তথ্যের ক্ষেত্রে এটি ব্যবহার করা চলবে না।

ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত জেনারেটর ও এন্ট্রপি

অনেক অ্যাপ্লিকেশনের একই সাথে দুটি সুবিধার প্রয়োজন হয়: একটি অ্যালগরিদমের গতি এবং একটি ভৌত উৎসের অনির্দেশ্যতা। এর সমাধান হলো ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত সিউডোর‍্যান্ডম নম্বর জেনারেটর (CSPRNG)। এটি মূলত একটি PRNG, তবে এটি এমনভাবে তৈরি করা হয়েছে যাতে এর ফলাফলের কিয়দংশ জেনেও বাকি অংশ অনুমান করার কোনো কার্যকর উপায় না থাকে; এবং এটি বাস্তব এন্ট্রপির কোনো উৎস থেকে সীড ও নিয়মিতভাবে পুনঃসীড করা হয়। কোনো সাধারণ PRNG-তে কেবল ভৌত উৎসের সীড দিলেই তা নিরাপদ হয়ে ওঠে না; অ্যালগরিদমটিকেও বিশেষভাবে সুরক্ষিত হতে হয়। থার্মাল নয়েজ কিংবা হার্ডওয়্যার ইভেন্টের সময়ের মতো কোনো ভৌত উৎস অল্প পরিমাণের খাঁটি র‍্যান্ডমনেস সরবরাহ করে, আর CSPRNG সেটি থেকে অনেক দ্রুতগতিতে মানের একটি দীর্ঘ ধারা তৈরি করে। অপারেটিং সিস্টেম তার ওপর পরিচালিত প্রোগ্রামগুলোকে এই সংমিশ্রণটিই প্রদান করে, এবং বর্তমানে বাস্তবে "র‍্যান্ডম নম্বর জেনারেটর" বলতে সাধারণত এটিকেই বোঝানো হয়। এটি এনক্রিপশন চাবি, সেশন টোকেন এবং পাসওয়ার্ড তৈরিতে ব্যবহৃত হয়।

ব্রাউজারে র‍্যান্ডম সংখ্যা

জাভাস্ক্রিপ্ট একটি ওয়েব পেজকে র‍্যান্ডম মান পাওয়ার জন্য দুটি অন্তর্নির্মিত উপায় দেয় এবং সেগুলো সম্পূর্ণ আলাদা শ্রেণির। Math.random() হলো একটি সাধারণ PRNG: ভাষার মানদণ্ডটি অ্যালগরিদমের দায়িত্ব ব্রাউজারের ওপর ছেড়ে দেয় এবং নিরাপত্তার কোনো নিশ্চয়তা দেয় না — কোনো অ্যানিমেশনের জন্য এটি যথেষ্ট, কিন্তু যে লটারির ফলাফল নিয়ে বিতর্ক হতে পারে তার জন্য অনুপযুক্ত। অপরটি হলো Web Crypto API। এর crypto.getRandomValues() মেথড ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত র‍্যান্ডম মান প্রদান করে, যা অপারেটিং সিস্টেমের এন্ট্রপি দিয়ে চালিত একটি CSPRNG দ্বারা তৈরি হয়।

আমাদের অনলাইন র‍্যান্ডম নম্বর জেনারেটর প্রতিটি লটারির জন্য Web Crypto API ব্যবহার করে এবং সংখ্যাগুলো সার্ভারের পরিবর্তে আপনার নিজের ব্রাউজারেই তৈরি হয়। এই ওয়েবসাইটের অন্যান্য জেনারেটরগুলোও একই উৎস থেকে পরিচালিত হয়, আপনি ছক্কা ফেলুন, কয়েন টস করুন বা পাসওয়ার্ড তৈরি করুন না কেন।

র‍্যান্ডম বিট থেকে আপনার কাঙ্ক্ষিত সীমার সংখ্যা

একটি নিরপেক্ষ লটারির অর্ধেক কৃতিত্ব ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত জেনারেটরের। এটি সাধারণ বিট সরবরাহ করে এবং প্রোগ্রামটিকে সেগুলোকে আপনার কাঙ্ক্ষিত সীমার একটি সংখ্যায় রূপান্তর করতে হয় — আর এখানেই অসম সম্ভাবনা বা পক্ষপাতদুষ্টতা দেখা দিতে পারে। ধরুন, মূল উৎসটি 0 থেকে 9 পর্যন্ত মানগুলো সমান সম্ভাবনায় দেয় এবং আপনার 0 থেকে 5 পর্যন্ত একটি সংখ্যার প্রয়োজন। 6 দিয়ে ভাগ করে ভাগশেষ নেওয়াটা স্বাভাবিক মনে হতে পারে, কিন্তু তখন 0, 1, 2 এবং 3 প্রতিটি সংখ্যা দুটি উপায়ে আসতে পারে এবং 4 ও 5 কেবল একটি উপায়ে আসতে পারে। ফলে 0 থেকে 3 পর্যন্ত প্রতিটি সংখ্যার সম্ভাবনা থাকে 20%, আর 4 এবং 5-এর সম্ভাবনা থাকে মাত্র 10% করে। এই অসম সম্ভাবনা দূর করার একটি উপায় হলো যে মানগুলো খাপ খায় না সেগুলোকে বাতিল করে পুনরায় ড্র করা; র‍্যান্ডম নম্বর সংক্রান্ত উপকরণে এটি বিস্তারিতভাবে আলোচনা করা হয়েছে।

আরও দুটি বিষয় মানুষকে অবাক করে। পুনরাবৃত্তি হওয়া স্বাভাবিক: যখন 1 থেকে 10 পর্যন্ত একটি পূর্ণসংখ্যা স্বাধীনভাবে ড্র করা হয় এবং প্রতিটি সংখ্যার আসার সম্ভাবনা সমান থাকে, তখন সদ্য আসা সংখ্যাটির পুনরায় আসার সম্ভাবনাও অন্য যেকোনো সংখ্যার মতোই 10 টির মধ্যে 1 টি থাকে। পুনরাবৃত্তি ছাড়া ড্র সম্পূর্ণ ভিন্ন ধরনের একটি নির্বাচন, এটি আরও বেশি র‍্যান্ডম এমন নয়। আর কেবল একটি নিরপেক্ষ জেনারেটর থাকলেই পুরো প্রক্রিয়াটি নিরপেক্ষ হয়ে যায় না: অংশগ্রহণকারীদের তালিকা এবং প্রচেষ্টার সংখ্যাও সমান গুরুত্বপূর্ণ, যেমনটি কীভাবে প্রতিযোগিতার বিজয়ী নির্বাচন করবেন বিষয়ক আমাদের নিবন্ধে ব্যাখ্যা করা হয়েছে।