দ্রুত এবং ন্যায্যভাবে একটি এলোমেলো সংখ্যা পেতে চান? এই বিনামূল্যের অনলাইন র্যান্ডম নম্বর জেনারেটরটি আপনার বেছে নেওয়া যেকোনো পরিসরে একটি সংখ্যা — অথবা সংখ্যার একটি সম্পূর্ণ তালিকা — তৈরি করে দেয়, ১ থেকে ১০-এর মতো সাধারণ পরিসর থেকে শুরু করে কোটি কোটি পর্যন্ত বিস্তৃত পরিসরে। 'সর্বনিম্ন' এবং 'সর্বোচ্চ' ঘরে সর্বনিম্ন ও সর্বোচ্চ মান বসান, কতগুলো সংখ্যা দরকার তা 'সংখ্যা' ঘরে বেছে নিন, এবং 'তৈরি করুন'-এ ক্লিক করুন। দুটো সীমাই ফলাফলের মধ্যে থাকে, তাই ১ থেকে ১০-এর একটি পরিসর ১ এবং ১০ — দুটোই দিতে পারে।
প্রতিটি ফলাফল সরাসরি আপনার ব্রাউজারে Web Crypto API (crypto.getRandomValues)-এর মাধ্যমে তৈরি হয় — এটি আপনার ব্রাউজারের অন্তর্নিহিত সিস্টেম এলোমেলোতা থেকে ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী মান সরবরাহ করে। কিছুই সার্ভারে পাঠানো হয় না, কিছুই সংরক্ষণ করা হয় না, এবং আমরা আপনার সংখ্যাগুলো কখনো দেখি না। ফলাফল তাৎক্ষণিকভাবে তৈরি হয় এবং ব্যক্তিগতই থাকে, আর পেজ লোড হওয়ার পর ধীর ইন্টারনেট সংযোগেও এটি কাজ করতে থাকে।
এই অপশনগুলো সেইসব বাস্তব পরিস্থিতির জন্য তৈরি করা হয়েছে, যেখানে মানুষের সত্যিই এলোমেলো সংখ্যার প্রয়োজন হয়। কোনো সংখ্যা যাতে দুবার না আসে সেজন্য 'পুনরাবৃত্তি ছাড়া' চালু করুন — এটি সেই সেটিং, যা আপনার লটারির ড্র, পুরস্কারের ড্র, বা মানুষকে পুনরাবৃত্তি ছাড়া দলে ভাগ করার জন্য দরকার। ৫০০ জন অংশগ্রহণকারীর মধ্যে থেকে বিশ জন বিজয়ী দরকার? 'সর্বনিম্ন' ১-এ এবং 'সর্বোচ্চ' ৫০০-এ বসান, 'পুনরাবৃত্তি ছাড়া' চালু করুন, 'সংখ্যা' ২০-এ বসান, এবং 'তৈরি করুন'-এ ক্লিক করুন। 'ক্রমবিন্যাস' ফলাফলকে ঊর্ধ্বক্রম বা নিম্নক্রমে সাজায়, এক ক্লিকেই সব ফলাফল কপি হয়ে যায়। 'আউটপুট ফরম্যাট'-কে 'নতুন লাইন' থেকে 'স্পেস দিয়ে পৃথক' অথবা 'কমা দ্বারা পৃথক'-এ পাল্টালে 'সেটের সংখ্যা' ঘরটি দেখা যায়: একসাথে একাধিক স্বাধীন ড্র — যেমন বিশটি ড্র রাউন্ডের জন্য প্রতিটিতে ৩টি করে সংখ্যার বিশটি সেট — আর 'সেটের মধ্যে পুনরাবৃত্তির অনুমতি দিন' ঠিক করে দেয় যে একই সংখ্যা একাধিক সেটে আসতে পারবে কিনা।
এলোমেলোতা আসলে কীভাবে তৈরি হয়? আপনার ব্রাউজার Math.random()-এর মতো কোনো JavaScript PRNG-এর বদলে Web Crypto API-এর মাধ্যমে ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী এলোমেলো মান সরবরাহ করে। 'তৈরি করুন'-এ ক্লিক করলে, পেজটি crypto.getRandomValues-এর মাধ্যমে এলোমেলো মান চায় এবং সেগুলো দিয়ে আপনার বেছে নেওয়া পরিসরে সংখ্যা তৈরি করে। এলোমেলোতার মূল উৎস আপনার ব্রাউজার এবং অপারেটিং সিস্টেম সরবরাহ করে, তাই পেজটিকে নিজস্ব কোনো শুরুর ভ্যালু (seed) বা সিউডো-র্যান্ডম ধারাবাহিকতা বজায় রাখতে হয় না।
একটি এলোমেলো মানকে আপনার পরিসরের মধ্যে বসানোর সময়ই জেনারেটরগুলো নিঃশব্দে ভুল করে বসে, আর এটি নিয়ে আলাদাভাবে বলা দরকার। মানটিকে পরিসরের আকার দিয়ে ভাগ করে যা অবশিষ্ট থাকে সেটা নেওয়াই সবচেয়ে সহজ পদ্ধতি, কিন্তু এটি পক্ষপাতদুষ্ট: পরিসরটি যদি ঠিকঠাক 2^32 দিয়ে ভাগ না হয়, তাহলে সবচেয়ে ছোট সংখ্যাগুলো বাকিদের চেয়ে একটু বেশি ঘন ঘন আসে। এই ত্রুটিটিকে বলা হয় modulo bias, আর এটি নিছক তাত্ত্বিক নয়, বরং পরিমাপযোগ্য। এই জেনারেটরটি এর বদলে পরিসরের সবচেয়ে বড় নির্ভুল গুণিতকের বাইরের যেকোনো মান বাদ দিয়ে আবার নতুন করে তৈরি করে — এই কৌশলটির নাম rejection sampling। এতে কয়েকটি অতিরিক্ত চেষ্টা লাগে, কিন্তু বিনিময়ে একটি সম্পূর্ণ নিশ্চয়তা পাওয়া যায়: 'সর্বনিম্ন' এবং 'সর্বোচ্চ'-এর মধ্যে প্রতিটি সংখ্যার সম্ভাবনা সম্পূর্ণ সমান থাকে, প্রায় সমান নয়।
একটি সংখ্যাকে আসলে কী সত্যিকারের এলোমেলো করে তোলে? একটি ফলাফলকে যথেষ্ট এলোমেলো বলা যায় তখনই, যখন আগের ফলাফলগুলো পরেরটি সম্পর্কে কিছুই বলে না — আর বাস্তবে এর তিনটি স্তর আছে। Math.random()-এর মতো একটি সাধারণ সিউডো-র্যান্ডম ফাংশন একটি নির্দিষ্ট (deterministic) অ্যালগরিদম চালায়: এর ভেতরের অবস্থা যে কেউ জেনে ফেললে পুরো ধারাবাহিকতা পুনরায় তৈরি করতে পারবে, যা একটি স্লাইডশো এলোমেলো করার জন্য ঠিক আছে, কিন্তু যেখানে ফলাফল অনুমানযোগ্য হওয়া চলবে না, সেখানে এটি একেবারেই অনুপযুক্ত। একটি ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত জেনারেটর (CSPRNG) — এই টুলটি যে স্তর ব্যবহার করে — সেটিও একটি অ্যালগরিদম, কিন্তু এটি সিস্টেমের একটি সুরক্ষিত এলোমেলোতার উৎস ব্যবহার করে অনুমান করা যায় না এমন মান তৈরি করার জন্য বানানো হয়েছে, আর এমনভাবে গঠন করা যে এর আউটপুট দেখলেও পরের মান সম্পর্কে কিছুই বোঝা যায় না। বায়ুমণ্ডলীয় শব্দ বা তেজস্ক্রিয় ক্ষয়ের মতো উৎস থেকে আসা প্রাকৃতিক এলোমেলোতা এই দুই স্তরের চেয়েও ওপরে থাকে, যদিও একটি পরিসর থেকে সংখ্যা তৈরি করার ক্ষেত্রে ব্যবহারিক পার্থক্যটা মিলিয়ে যায়। ঠিক এই কারণেই ব্রাউজারগুলো শুধু Math.random()-কে উন্নত না করে আলাদা একটি ক্রিপ্টো API সামনে আনে: এই দুটি ভিন্ন সমস্যার সমাধান করে, আর ফলাফল কারও কাছে গুরুত্বপূর্ণ হলে শুধু একটিই নিরাপদ।
একটি এলোমেলো ধারাবাহিকতা মানুষের কাছে এলোমেলো দেখাতেই হবে, এমন কোনো কথা নেই। ১ থেকে ১০-এর মধ্যে দশটি সংখ্যা তৈরি করুন, দেখবেন নিয়মিতই একটি পুনরাবৃত্তি, ৭, ৭, ৮-এর মতো প্রায়-জোড়া, অথবা এমন একটি ছোট ধারা দেখা যাচ্ছে যেখানে সবগুলো সংখ্যাই বড় — আর এর প্রতিটিই একদম স্বাভাবিক। প্রকৃত এলোমেলোতা অনুমান করা যায় না, সমানভাবে ছড়িয়ে থাকে না: প্রতিটি সংখ্যা আগেরগুলো থেকে স্বাধীনভাবে আসে, আগের সংখ্যাগুলোর পরেরগুলোর ওপর একেবারেই কোনো প্রভাব নেই, আর কোনো সংখ্যারই অন্য কোনো সংখ্যার চেয়ে বেশি বার আসার সম্ভাবনা নেই। এর উল্টোটা মনে করার এই প্রবণতাই হলো জুয়াড়ির ভ্রান্তি, আর এই একই প্রবণতা মানুষকে নিজেরাই খারাপ র্যান্ডম নম্বর জেনারেটর বানিয়ে দেয় — আমাদের যখন নিজে থেকে একটি এলোমেলো ধারাবাহিকতা বানাতে বলা হয়, আমরা পুনরাবৃত্তি এড়িয়ে চলি এবং মানগুলোকে এলোমেলোতা যতটা করত তার চেয়ে অনেক বেশি সমানভাবে ছড়িয়ে দিই। অতিরিক্ত গোছানো দেখায় এমন একটি ফলাফল আসলে মানুষের প্রত্যাশার ছাপ; প্রকৃত এলোমেলোতা গুচ্ছ তৈরি করে।
এই র্যান্ডম নম্বর জেনারেটরটি কেন বেছে নেবেন?
- শুধুমাত্র ব্রাউজারে তৈরি: সংখ্যাগুলো আপনার ডিভাইসেই তৈরি হয় এবং কখনো অন্য কোথাও পাঠানো হয় না
- Web Crypto API-এর মাধ্যমে এলোমেলোতা: ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত, Math.random() নয়
- কোনো modulo bias নেই: rejection sampling পরিসরের প্রতিটি সংখ্যার জন্য সমান সম্ভাবনা বজায় রাখে
- যেকোনো পরিসর: ১ থেকে ১০ থেকে শুরু করে কোটি কোটি পর্যন্ত বিস্তৃত মান, দুটো সীমাই অন্তর্ভুক্ত
- 'পুনরাবৃত্তি ছাড়া' মোড: ড্র এবং দল ভাগ করার জন্য পুনরাবৃত্তিহীন তালিকা তৈরি করুন
- একাধিক সেট: এক ক্লিকেই একাধিক স্বাধীন ড্র
- ক্রমবিন্যাস ও আউটপুট ফরম্যাট: ঊর্ধ্বক্রম বা নিম্নক্রম, নতুন লাইন, স্পেস বা কমা
- ইতিহাস ও ফাইলে সংরক্ষণ: এমন একটি ড্রের রেকর্ড রাখুন, যা হয়তো পরে প্রমাণ করতে হতে পারে
- সীমাহীন ও বিনামূল্যে: কোনো সাইন-আপ লাগে না, ব্যবহারের কোনো সীমা নেই, আমাদের সার্ভারে কিছুই সংরক্ষণ করা হয় না
বেশিরভাগ মানুষ যা ভাবেন, তার চেয়ে অনেক বেশি জায়গায় এলোমেলো সংখ্যা ব্যবহার করা হয়। শিক্ষকরা কাউকে পক্ষপাত না করে ছাত্রছাত্রীদের ডাকেন। স্ট্রিমার এবং মার্কেটিং টিমরা এমন দর্শকদের সামনে উপহার এবং ড্রয়ের বিজয়ী ঠিক করেন, যাদের ফলাফলে বিশ্বাস করতে হয়। খেলোয়াড়রা হারিয়ে যাওয়া পাশা বদলে নেন বা কে প্রথমে শুরু করবেন তা ঠিক করেন, আর টুর্নামেন্টে শুরুর ক্রম ড্র করে ঠিক করা হয়। গবেষকরা এলোমেলো নমুনা বেছে নেন, যাতে তাঁদের ফলাফল গবেষণায় অংশ না নেওয়া মানুষদের জন্যও প্রযোজ্য হয়। ডেভেলপাররা পরীক্ষামূলক ডেটা তৈরি করেন, সিমুলেশনের জন্য একটি শুরুর ভ্যালু (seed) বসান, এবং QA-এর সময় আইডেন্টিফায়ার বেছে নেন। এদের মধ্যে সাধারণ বিষয়টি হলো একটি এলোমেলো নির্বাচন প্রক্রিয়া, যার ফলাফল কীভাবে তৈরি হয়েছে তা পরে ব্যাখ্যা করা যায়: যেহেতু ড্রটি ক্রিপ্টোগ্রাফিক এলোমেলোতা ব্যবহার করে এবং সম্পূর্ণভাবে আপনার ডিভাইসেই ঘটে, তাই কেউ প্রশ্ন তুললে আপনি দেখাতে পারবেন ফলাফলটি কীভাবে তৈরি হয়েছে।
এই জেনারেটরের কিছু সৎ সীমাবদ্ধতা আছে, যেগুলো জানা দরকার। 'পুনরাবৃত্তি ছাড়া' মোড পরিসরে যা আছে তার চেয়ে বেশি সংখ্যা তৈরি করতে পারে না: ১ থেকে ১০-এর মধ্যে বিশটি অনন্য মান আসলে থাকেই না। ড্রগুলো স্বাধীন, আর আগের ফলাফল পরেরগুলোকে প্রভাবিত করে না, তাই পেজ রিফ্রেশ করলে কোনো চক্র নতুন করে শুরু হয় না — কারণ এমন কোনো চক্রই নেই, যার মধ্যে আপনি থাকতে পারেন। আর সংখ্যাগুলো ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী হলেও, এখানকার ড্র একটি ভবিষ্যদ্বাণী নয়, বরং একটি ন্যায্য পছন্দ: সরকারি লটারির ড্র নিজস্ব শারীরিক বা প্রত্যায়িত সরঞ্জাম ব্যবহার করে, আর আপনার ব্রাউজারে হিসাব করা কোনো কিছুরই তার সঙ্গে কোনো সম্পর্ক নেই। এই সীমাবদ্ধতার মধ্যেও নিশ্চয়তাটি শক্তিশালী থাকে: আপনার পরিসরের প্রতিটি সংখ্যার প্রতিটি আলাদা ড্রয়ে সম্পূর্ণ সমান সম্ভাবনা থাকে।