আপনি যে লিঙ্কটি যুক্ত করেছেন তার প্রথমে আপনি সুরক্ষার উদ্দেশ্যে কেবল এলোমেলো সংখ্যার বিষয়ে কথা বলেন। সুতরাং এটি দাবি করে নাRandom
নিরাপত্তাজনিত উদ্দেশ্যে খারাপ।
তবে আমি এটি দাবি করি। । নেট 4 বাস্তবায়ন Random
বেশ কয়েকটি উপায়ে ত্রুটিযুক্ত। আপনি যদি আপনার এলোমেলো সংখ্যার গুণমান সম্পর্কে চিন্তা না করেন তবেই আমি এটি ব্যবহার করার পরামর্শ দিচ্ছি। আমি আরও ভাল তৃতীয় পক্ষের প্রয়োগগুলি ব্যবহার করার পরামর্শ দিচ্ছি।
ত্রুটি 1: বীজ বপন
বর্তমান সময়ের সাথে ডিফল্ট নির্মাতা বীজ। সুতরাং Random
স্বল্প সময়সীমায় (সিএ। 10 মিমি) ডিফল্ট কনস্ট্রাক্টরের সাথে তৈরি সমস্ত দৃষ্টান্ত একই ক্রম ফিরে আসে। এটি নথিভুক্ত এবং "বাই ডিজাইন"। আপনি যদি আপনার কোডটি বহু-থ্রেড করতে চান তবে এটি বিশেষত বিরক্তিকর, যেহেতু আপনি কেবল উদাহরণটি তৈরি করতে পারবেন নাRandom
প্রতিটি থ্রেডের প্রয়োগের শুরুতে ।
ডিফল্ট কনস্ট্রাক্টর ব্যবহার করার সময় প্রয়োজনীয় সতর্কতা অবলম্বন করা দরকার এবং প্রয়োজনে ম্যানুয়ালি বীজ বুনতে হবে।
এখানে আরেকটি সমস্যা হ'ল বীজের জায়গাটি বরং ছোট (31 বিট)। সুতরাং আপনি যদি Random
পুরোপুরি এলোমেলো বীজের সাথে 50k উদাহরণ তৈরি করেন তবে আপনি সম্ভবত দুবার এলোমেলো সংখ্যার এক ক্রম পাবেন ( জন্মদিনের প্যারাডক্সের কারণে )। সুতরাং ম্যানুয়াল সিডিং সঠিকভাবে পাওয়া সহজ নয়।
ত্রুটি 2: এড়ানো এলোমেলো সংখ্যার বিতরণ Next(int maxValue)
পক্ষপাতদুষ্ট
এমন প্যারামিটার রয়েছে যার Next(int maxValue)
জন্য পরিষ্কারভাবে অভিন্ন নয়। উদাহরণস্বরূপ আপনি যদি গণনা করেন তবে আপনি নমুনাগুলির প্রায় 2/3 r.Next(1431655765) % 2
পেয়ে যাবেন 0
। (উত্তরের শেষে নমুনা কোড।)
ত্রুটি 3: NextBytes()
পদ্ধতিটি অদক্ষ।
প্রতি বাইট ব্যয়টি NextBytes()
সম্পূর্ণ পূর্ণসংখ্যার নমুনা তৈরি করতে ব্যয়ের সাথে প্রায় বড়Next()
। এ থেকে আমার সন্দেহ হয় যে তারা সত্যই বাইট প্রতি একটি নমুনা তৈরি করে।
প্রতিটি নমুনার মধ্যে 3 বাইট ব্যবহার করে একটি ভাল বাস্তবায়ন গতিবেগ হবে NextBytes()
প্রায় 3 গুণক দ্বারা হবে।
এই ত্রুটির Random.NextBytes()
জন্য ধন্যবাদ প্রায় 25% এর চেয়ে দ্রুত fasterSystem.Security.Cryptography.RNGCryptoServiceProvider.GetBytes
আমার মেশিনের (উইন 7, কোর আই 3 2600MHz)।
আমি নিশ্চিত যে যদি কেউ আমার ব্ল্যাক বক্স বিশ্লেষণের সাথে পাওয়া উত্সের চেয়ে / ডিসপম্পলিত বাইট কোডটি পরীক্ষা করে তবে তারা আরও ত্রুটিগুলি খুঁজে পেতে পারে।
কোড নমুনা
r.Next(0x55555555) % 2
দৃ strongly় পক্ষপাতদুষ্ট:
Random r = new Random();
const int mod = 2;
int[] hist = new int[mod];
for(int i = 0; i < 10000000; i++)
{
int num = r.Next(0x55555555);
int num2 = num % 2;
hist[num2]++;
}
for(int i=0;i<mod;i++)
Console.WriteLine(hist[i]);
কর্মক্ষমতা:
byte[] bytes=new byte[8*1024];
var cr=new System.Security.Cryptography.RNGCryptoServiceProvider();
Random r=new Random();
for(int i=0;i<100000;i++)
{
r.NextBytes(bytes);
}
for(int i=0;i<100000;i++)
{
for(int j=0;j<bytes.Length;j++)
bytes[j]=(byte)r.Next();
}
for(int i=0;i<100000;i++)
{
for(int j=0;j+2<bytes.Length;j+=3)
{
int num=r.Next();
bytes[j+2]=(byte)(num>>16);
bytes[j+1]=(byte)(num>>8);
bytes[j]=(byte)num;
}
}
for(int i=0;i<100000;i++)
{
cr.GetBytes(bytes);
}