আমাকে আগেই ক্ষমা চাইতে দাও, কারণ এটি বুঝতে কিছুটা শক্ত ...
প্রথমত, আপনি ইতিমধ্যে জানেন যে java.util.Random
এটি একেবারে এলোমেলো নয়। এটি বীজ থেকে নিখুঁতভাবে অনুমানযোগ্য উপায়ে সিকোয়েন্স তৈরি করে। আপনি সম্পূর্ণরূপে সঠিক যে বীজটি কেবলমাত্র 64 বিট দীর্ঘ, এটি কেবল 2 2 64 বিভিন্ন সিকোয়েন্স তৈরি করতে পারে। আপনি একরকম 64 বাস্তব র্যান্ডম বিট তৈরী করা এবং একটি বীজ নির্বাচন করতে তাদের ব্যবহার করতে হলে, আপনি যে বীজ ব্যবহার করতে পারে এলোমেলোভাবে মধ্যে নির্বাচন করতে সব 52 এর! সমান সম্ভাবনা সহ সম্ভাব্য ক্রম।
তবে, যতক্ষণ না আপনি 2 2 sequ 64 সিকুয়েন্স তৈরি করতে যাচ্ছেন না, ততক্ষণ এই সত্যটির কোনও ফলস্বরূপ নয়, যতক্ষণ না 2 ^ 64 ক্রমগুলি তৈরি করতে পারে সে সম্পর্কে 'বিশেষ' বা 'উল্লেখযোগ্যভাবে বিশেষ' কিছুই নেই as ।
বলুন আপনার কাছে আরও অনেক ভাল পিআরএনজি ছিল যা 1000 বিট বীজ ব্যবহার করেছিল। কল্পনা করুন আপনার এটিকে আরম্ভ করার দুটি উপায় রয়েছে - একটি উপায় এটি পুরো বীজটি ব্যবহার করে আরম্ভ করবে এবং এক উপায়ে বীজটিকে আরম্ভ করার আগে 64৪ বিট করে হ্যাশ করবে।
আপনি যদি না জানতেন কোন প্রারম্ভকালীন কোনটি, তবে আপনি কী তাদের আলাদা করতে কোনও ধরণের পরীক্ষা লিখতে পারেন? যদি আপনি (আনহান) যথেষ্ট ভাগ্যবান না হন তবে দু' বার একই 64 টি বিটের সাহায্যে খারাপটি শুরু করতে পারেন, তবে উত্তরটি নেই। নির্দিষ্ট পিআরএনজি বাস্তবায়নে কিছুটা দুর্বলতার বিশদ জ্ঞান না থাকলে আপনি দুটি প্রারম্ভিকের মধ্যে পার্থক্য করতে পারবেন না।
বিকল্পভাবে, কল্পনা করুন যে Random
শ্রেণীর 2 ^ 64 ক্রমগুলির একটি অ্যারে ছিল যা সুদূর অতীতে কোনও সময়ে সম্পূর্ণ এবং এলোমেলোভাবে নির্বাচিত হয়েছিল এবং বীজটি এই অ্যারেতে কেবল একটি সূচক ছিল।
সুতরাং Random
এটির বীজের জন্য কেবলমাত্র 64৪ টি বিট ব্যবহার করার বিষয়টি আসলে পরিসংখ্যানগতভাবে কোনও সমস্যা নয় , যতক্ষণ না আপনি দু'বার একই বীজ ব্যবহার করবেন এমন কোনও উল্লেখযোগ্য সম্ভাবনা নেই।
অবশ্যই, ক্রিপ্টোগ্রাফিক উদ্দেশ্যে, একটি bit৪ বিট বীজ কেবল পর্যাপ্ত নয়, কারণ একই বীজ দু'বার ব্যবহার করার জন্য একটি সিস্টেম পাওয়া গণনাযোগ্যভাবে সম্ভাব্য।
সম্পাদনা করুন:
উপরের সমস্তটি সঠিক হওয়া সত্ত্বেও আমার এটিকে যুক্ত করা উচিত, প্রকৃত বাস্তবায়নটি java.util.Random
দুর্দান্ত নয়। আপনি যদি কোনও কার্ড গেমটি লিখছেন, তবে সম্ভবত MessageDigest
SHA-256 হ্যাশ উৎপন্ন করতে API টি ব্যবহার করুন এবং ডিকগুলি সাফল্যের "MyGameName"+System.currentTimeMillis()
জন্য এই বিটগুলি ব্যবহার করুন। উপরোক্ত যুক্তি অনুসারে, যতক্ষণ না আপনার ব্যবহারকারীরা সত্যিই জুয়া খেলছেন না, currentTimeMillis
ততক্ষণ আপনাকে চিন্তিত হওয়ার দরকার নেই যে দীর্ঘক্ষণ ফিরে আসে। আপনার ব্যবহারকারীরা যদি সত্যিই জুয়া খেলেন তবে SecureRandom
কোনও বীজ ছাড়াই ব্যবহার করুন ।
Random
কখনই আসল এলোমেলো সংখ্যা নয়। এটি পিআরএনজি, যেখানে পি "সিডো"। আসল এলোমেলো সংখ্যার জন্য আপনার এলোমেলো উত্সের প্রয়োজন (যেমন র্যান্ডম.org)।