কেন সি. ক্লাস সিস্টেম.র্যান্ডম একেবারে System.Security.Cryptography.RandomNumberGenerator এর পরিবর্তে ব্যবহার করবেন?


87

কেন কেউ সিস্টেম থেকে র্যান্ডম নম্বর জেনারেটরটি ব্যবহার করবে? সিস্টেম থেকে র্যান্ডম সংখ্যার জেনারেটর ব্যবহারের পরিবর্তে এ জাতীয় স্থিতি.সিকিউরিটি.ক্রিপ্টোগ্রাফি.র্যান্ডম নাম্বার জেনারেটর (বা এর সাবক্লাসগুলি কারণ র্যান্ডম নাম্বারজেনেটর বিমূর্ত)?

ন্যাট লসন তার গুগল টেক টক উপস্থাপনা " ক্রিপ্টো স্ট্রাইকস ব্যাক " 13 মিনিটের সময় আমাদের বলেছেন পাইথন, জাভা এবং সি # এর "স্ট্যান্ডার্ড" র্যান্ডম সংখ্যার জেনারেটর ব্যবহার না করে এবং এর পরিবর্তে ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত সংস্করণটি ব্যবহার করুন।

আমি এলোমেলো সংখ্যা জেনারেটরের দুটি সংস্করণের মধ্যে পার্থক্য জানি ( প্রশ্ন 101337 দেখুন )।

তবে সর্বদা সুরক্ষিত র্যান্ডম নম্বর জেনারেটরটি ব্যবহার না করার কী যুক্তি রয়েছে? কেন System.Random একেবারেই ব্যবহার করবেন? পারফরম্যান্স সম্ভবত?


7
বরং আপনি কোনটি টাইপ করবেন?
মাচা

13
অনেক লোক গুরুত্ব সহকারে এটিকে তারা যা করেন তার ন্যায়সঙ্গততা হিসাবে ব্যবহার করে (সাধারণত উচ্চস্বরে না)। কোডটি এর চেয়ে বেশি লেখা হয়, তুচ্ছ দৈর্ঘ্যের পার্থক্য সম্পর্কে কে চিন্তা করে?
মার্ক সোওল

4
তবে যাইহোক আপনি যদি ক্রিপ্টোগ্রাফি না করে থাকেন তবে আপনার কেন ক্রিপ্টোগ্রাফিক আরএনজি ব্যবহার করা উচিত?
মার্ক সোউলুল

4
@ মাছা, এটাই কি এ্যালিয়াসের জন্য ->using R = System.Security.Cryptography.RandomNumberGenerator; R.Create();
চেম্বারলাইন

উত্তর:


147

গতি এবং অভিপ্রায়। যদি আপনি একটি এলোমেলো সংখ্যা জেনারেট করে থাকেন এবং সুরক্ষার প্রয়োজন নেই, তবে স্লো ক্রিপ্টো ফাংশনটি কেন ব্যবহার করবেন? আপনার সুরক্ষার দরকার নেই, তাই অন্য কাউকে কেন ভাবেন যে নম্বরটি সুরক্ষিত কোনও কিছুর জন্য ব্যবহার করা যেতে পারে যখন তা হবে না?


31
আমি খুব অভিপ্রায় যুক্তি পছন্দ।
লার্নকুরভে

12
এটি লক্ষ করা উচিত যে র‌্যান্ডম.গেটনেক্সট বর্ণালীতে বিশেষত থ্রেডযুক্ত পরিবেশে এলোমেলো সংখ্যাগুলি "ছড়িয়ে দেওয়া" থেকে খুব দূরে। র্যান্ড 5 সমস্যা থেকে র্যান্ড 7 এর বিভিন্ন সমাধান পরীক্ষা করার জন্য একটি প্রোগ্রাম লিখতে গিয়ে আমি এই সমস্যাটি ছড়িয়ে দিয়েছি। দ্রুত থ্রেড পরীক্ষায় এখন 100000 এলোমেলো সংখ্যার মধ্যে 0 এবং 10 এর মধ্যে, উত্পন্ন সংখ্যাগুলির মধ্যে 82470 ছিল 0। আমি আমার আগের পরীক্ষাগুলিতেও একই রকম তাত্পর্য দেখেছি। ক্রিটপোগ্রাফি এলোমেলোভাবে তার সংখ্যার বিতরণেও। আমি অনুমান করি যে পাঠটি আপনার র্যান্ডম ডেটাটি আপনার প্রয়োজনের জন্য "যথেষ্ট এলোমেলো" তা দেখতে সর্বদা পরীক্ষা করা হয়।
ক্রিস্টোফার এল

35
@ ক্রিস্টোফার আমার ধারণা আপনি অপব্যবহার করেছেন Random। আমাকে অনুমান করতে দাও: আপনি Randomপ্রতিটি সংখ্যার জন্য ক্লাসের একটি নতুন উদাহরণ তৈরি করেছেন , যেহেতু এটি মোটা টাইমার দ্বারা বীজযুক্ত করা হবে প্রায় 1-16 মাইলের ব্যবধানের জন্য একই মান সহ বীজ হবে।
কোডসইনচওস

15
@ কোডসইনচওস: এর পাশাপাশি, এমন একটি রেস-শর্ত রয়েছে Randomযা একই বস্তুকে একাধিক থ্রেড থেকে ব্যবহার করা হলে সমস্ত 0 টির জন্য ফিরে আসে।
ব্লুরাজা - ড্যানি পিফ্লুঘিওফ্ট

4
@ ক্রিস্টোফারএল: উপরের মন্তব্যটি দেখুন, এই
উত্তরটিও

66

গতি এবং আরও দরকারী ইন্টারফেস ( NextDouble()ইত্যাদি) ছাড়াও একটি নির্দিষ্ট বীজের মান ব্যবহার করে পুনরাবৃত্তযোগ্য র্যান্ডম ক্রম তৈরি করাও সম্ভব। টেস্টিংয়ের সময় অন্যদের মধ্যে এটি বেশ কার্যকর।

Random gen1 = new Random();     // auto seeded by the clock
Random gen2 = new Random(0);    // Next(10) always yields 7,8,7,5,2,....

4
এবং বিটকনভার্টর আছে। টোইন্ট 32 (বাইট [] মান, ইন্টি স্টার্টইনডেক্স) যা বুঝতে সহজ হতে পারে। ;)
সিসেভ করুন

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


4
@ ফগ "ফলস্বরূপ, আপনার অ্যাপ্লিকেশন কোড ধরে নেওয়া উচিত নয় যে একই বীজের ফলাফল। নেট ফ্রেমওয়ার্কের বিভিন্ন সংস্করণে একই সিউডো-এলোমেলো ক্রম হবে।" - আমি জানি না, আমার কাছে বেশ পরিষ্কার মনে হচ্ছে। তবে, এই সতর্কতা থাকা সত্ত্বেও তারা যদি বিদ্যমান প্রোগ্রামগুলি না ভেঙে বাস্তবে এটিকে পরিবর্তন করতে না পারে তবে আমি অবাক হব না।
রোমান স্টারকভ 20

4
@ ফুগ: আপনি একটি কথা বলছেন এবং তার ঠিক বিপরীতে। আপনি সরাসরি নিজের সাথে বিরোধিতা করছেন।
টিমউই

54

আপনি যে লিঙ্কটি যুক্ত করেছেন তার প্রথমে আপনি সুরক্ষার উদ্দেশ্যে কেবল এলোমেলো সংখ্যার বিষয়ে কথা বলেন। সুতরাং এটি দাবি করে না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();

// Random.NextBytes
for(int i=0;i<100000;i++)
{
    r.NextBytes(bytes);
}

//One sample per byte
for(int i=0;i<100000;i++)
{   
    for(int j=0;j<bytes.Length;j++)
      bytes[j]=(byte)r.Next();
}

//One sample per 3 bytes
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;
    }
    //Yes I know I'm not handling the last few bytes, but that won't have a noticeable impact on performance
}

//Crypto
for(int i=0;i<100000;i++)
{
    cr.GetBytes(bytes);
}

4
আকর্ষণীয়, আপনার সন্ধানের বিষয়টি নিশ্চিত করতে পারে: আমার মেশিনে নেক্সট (1431655765) কোনও বীজ সহ 2/3 দেয়। 1431655765 এর যাদু কি? আপনি কিভাবে এই নম্বর পৌঁছেছেন?
সিটিকিড

4
@ সিটিকিড নম্বরটি হেক্স বা বিট হিসাবে দেখুন। সন্দেহজনক উপায়ে ম্যাজিকটি উত্থাপিত Randomহয় নির্দিষ্ট upperর্ধ্ব সীমানা সহ একটি 31 বিট পূর্ণসংখ্যাকে একটি সংখ্যায় রূপান্তর করতে ব্যবহার করে। আমি বিশদটি ভুলে গিয়েছিলাম, তবে এটি এমন কিছু randomValue * max / 2^{31}
কোডসইনচাউস

1431655765_10 = 101010101010101010101010101010101_2
টিম এস

6
এইচএম সুতরাং সি # র্যান্ডম ব্যবহারের জন্য আপনি কী ব্যবহারের পরামর্শ দিচ্ছেন?
আর্সেন জহরে

4
পবিত্র গাভী, বিতরণের অ-অভিন্নতা, Next()এখানে আপনার দ্বারা প্রদর্শিত, এটি একটি দুর্দান্ত দর্শনীয় বাগ - এবং আজও উপস্থিত রয়েছে, আপনি নিজের অনুসন্ধানগুলি প্রথম লিখে দেওয়ার 6 বছর পরে। (আমি কেবল "ত্রুটি" না দিয়ে "বাগ" বলি, কারণ ডক্স দাবী করে যে "সিউডো-এলোমেলো সংখ্যাগুলি একটি সংখ্যার সীমাবদ্ধ সমষ্টি থেকে সমান সম্ভাব্যতার সাথে বেছে নেওয়া হয়" এটি তেমন নয় এবং আপনার কোডটি এটি প্রমাণ করে))
মার্ক অ্যামেরি

24

সিস্টেম.র্যান্ডম অনেক বেশি পারফরম্যান্ট, যেহেতু এটি ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত র্যান্ডম সংখ্যা তৈরি করে না।

আমার মেশিনে এলোমেলো উপাত্ত সহ ১,০০,০০০ বার 4 বাইটের বাফার ভর্তি একটি সাধারণ পরীক্ষাটি র‌্যান্ডমের জন্য 49 এমএস, তবে আরএনজিক্রিপ্টো সার্ভিসপ্রোভাইডারের জন্য 2845 এমএস লাগে। মনে রাখবেন যে আপনি যে বাফারটি পূরণ করছেন তার আকার বাড়িয়ে দিলে আরএনজিক্রিপ্টোসেবাপ্রাইভাইডারের ওভারহেড হিসাবে পার্থক্যটি কম প্রাসঙ্গিক।


4
এটি একটি আসল পরীক্ষা দিয়ে প্রদর্শনের জন্য আপনাকে ধন্যবাদ।
লার্নকুরভে

4
আপনার মনে হতে পারে এটি কঠোর, তবে -1 মাপদণ্ডের কোডটি অন্তর্ভুক্ত না করে পারফরম্যান্স বেঞ্চমার্কের ফলাফল পোস্ট করার জন্য। এমনকি যদি গত 8 বছরে পারফরম্যান্সের বৈশিষ্ট্যগুলি পরিবর্তন হয় না Randomএবং RNGCryptoServiceProviderপরিবর্তিত হয় (যা আমি জানি তারা হয়তো তাদের করেছে), স্ট্যাক ওভারফ্লোতে আমি যথেষ্ট পরিমাণে ভাঙ্গা বেঞ্চমার্ক দেখেছি যার কোডের বেঞ্চমার্কের ফলাফলগুলিতে বিশ্বাস না করার জন্য প্রকাশ্যে উপলভ্য নয়।
মার্ক অ্যামেরি

21

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

যে কোনও উপায়ে, আপনার অ্যাপ্লিকেশনটি এখন অন্যান্য সম্পর্কিত সম্পূর্ণ আক্রমণাত্মক অ্যাপ্লিকেশনগুলির জন্য আক্রমণ ভেক্টর হয়ে উঠেছে - যা আপনার মত নয় - প্রকৃতপক্ষে প্রাণবন্তভাবে নির্ভর করে সিপিআরএনজির ক্রিপ্টোগ্রাফিক বৈশিষ্ট্যের উপর করে।

এটি একটি আসল বাস্তব সমস্যা, বিটিডাব্লু, যা হেডলেস সার্ভারগুলিতে (যা স্বাভাবিকভাবে বরং ছোট্ট এনট্রপি পুল রয়েছে কারণ তাদের মাউস এবং কীবোর্ড ইনপুট যেমন এনট্রপি উত্সের অভাব রয়েছে) চলমান লিনাক্স, যেখানে অ্যাপ্লিকেশনগুলি ভুলভাবে /dev/randomসমস্ত প্রকারের জন্য কার্নেল সিপিআরএনজি ব্যবহার করে এলোমেলো সংখ্যার, যদিও সঠিক আচরণটি হ'ল একটি ছোট বীজ মান পড়তে হবে /dev/urandomএবং তাদের নিজস্ব পিআরএনজি বীজ করতে ব্যবহার করতে হবে ।


আমি উইকিপিডিয়া নিবন্ধ এবং এনট্রপি এবং এনট্রপি হ্রাস সম্পর্কে অন্যান্য কিছু ইন্টারনেট উত্স পড়েছি এবং আমি এটি বেশ বুঝতে পারি না। যখন এলোমেলো নম্বর জেনারেটরকে সিস্টেম সময়, ফ্রি বাইটের সংখ্যা ইত্যাদি সরবরাহ করা হয় তখন কীভাবে আমি এন্ট্রপি পুলটি কমিয়ে ফেলব? অন্যরা এলোমেলো সংখ্যার পূর্বাভাস দেওয়ার জন্য কীভাবে আক্রমণ আক্রমণকারী হিসাবে ব্যবহার করতে পারে? আপনি একটি সহজ উদাহরণ প্রদান করতে পারেন? সম্ভবত এই আলোচনাটি অবশ্যই অফলাইনে নেওয়া উচিত। en.wikipedia.org/wiki/Entropy_%28computing%29
Lernkurve

4
সিস্টেম সময় কোনও এনট্রপি উত্স নয়, কারণ এটি অনুমানযোগ্য। আমি ফ্রি বাইটের সংখ্যা সম্পর্কে নিশ্চিত নই, তবে আমি সন্দেহ করি এটি একটি উচ্চ-মানের এনট্রপি উত্স। সার্ভারে আরও অনুরোধ প্রেরণ করে, আক্রমণকারী ফ্রি বাইটের সংখ্যা হ্রাস করতে পারে, এটি আংশিকভাবে নির্বিচারে তৈরি করে। আপনার অ্যাপ্লিকেশন আক্রমণ আক্রমণে পরিণত হয়েছে কারণ এন্ট্রপি পুলটি হ্রাস করে, এটি অন্য, সুরক্ষা-সমালোচনামূলক অ্যাপ্লিকেশনটিকে কম র্যান্ডম এলোমেলো সংখ্যা ব্যবহার করতে বাধ্য করে - বা এনট্রপি উত্সটি পুনরায় পূরণ না হওয়া পর্যন্ত অপেক্ষা করে।
কোয়ান্ট_দেব

আমি বুঝতে পারি যে যদি কারও কাছে সিউডো-এলোমেলো জেনারেটর যেমন একটি 32-বিট বীজ খাওয়ানো হয় তবে একটি আক্রমণাত্মক আক্রমণটি প্রায়শই যথেষ্ট সহজ হবে; এমনকি একটি -৪-বিট বীজ জন্মদিনের আক্রমণে পড়তে পারে। একবার বীজ তার থেকে অনেক বড় হয়ে উঠলেও, আমি ঝুঁকিটি বেশ দেখি না। যদি কারও কাছে এলোমেলো জেনারেটর থাকে যা প্রতিটি বাইটের জন্য একটি ব্লক এনক্রিপশন অ্যালগরিদমের মধ্য দিয়ে একটি 128-বিট অবস্থা পাস করে এবং নীচে 8 বিটগুলি আউটপুট করে, তবে কীভাবে আক্রমণকারী এমনকি পরপর আউটপুট বাইটের গিগ দিয়েও রাষ্ট্রকে অনুমান করতে পারে, এতে অনুপস্থিত দুর্বলতা রয়েছে এনক্রিপশন অ্যালগরিদম নিজেই?
সুপারক্যাট

11

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


9

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

শেষ পর্যন্ত, কোনও আরএনজি নির্বাচন ঝুঁকি / পুরষ্কারের অনুপাতে নেমে আসে। কিছু অ্যাপ্লিকেশনগুলিতে, উদাহরণস্বরূপ একটি ভিডিও গেম, এতে কোনও ঝুঁকি নেই। একটি লেহমার আরএনজি পর্যাপ্ত চেয়ে বেশি এবং এটি ছোট, সংক্ষিপ্ত, দ্রুত, ভাল বোঝা এবং 'বাক্সে'।

যদি অ্যাপ্লিকেশনটি উদাহরণস্বরূপ হয় তবে কোনও অন-লাইন জুজু খেলা বা লটারি যেখানে সত্যিকারের পুরষ্কার জড়িত থাকে এবং সমীকরণের কোনও পর্যায়ে আসল টাকা খেলতে আসে, 'বাক্সে' লেহারের পক্ষে পর্যাপ্ত পরিমাণ নেই। একটি 32-বিট সংস্করণে, এটি সর্বোত্তমভাবে চক্র শুরু করার আগে কেবল 2 ^ 32 সম্ভাব্য বৈধ রাষ্ট্র রয়েছে । আজকাল, এটি একটি নিষ্ঠুর বাহিনীর আক্রমণ একটি মুক্ত দরজা। এর মতো ক্ষেত্রে, বিকাশকারী কিছু প্রজাতির খুব দীর্ঘ সময়কাল আরএনজির মতো কিছুতে যেতে চাইবে এবং সম্ভবত এটি কোনও ক্রিপ্টোগ্রাফিক দিক থেকে শক্তিশালী সরবরাহকারীর কাছ থেকে বীজ বপন করবে। এটি গতি এবং সুরক্ষার মধ্যে একটি ভাল সমঝোতা দেয়। এই জাতীয় ক্ষেত্রে, ব্যক্তিটি এর মতো কিছু খুঁজবে out মার্সেন টুইস্টার বা একরকম একাধিক পুনরাবৃত্ত জেনারেটরের মতো কিছু সন্ধান করবে।

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


4
আমি মনে করি আপনি আপনার প্রশস্ততা সম্পর্কে ভুল; আর্থিক তথ্য প্রেরণ অত্যন্ত দ্রুত হওয়া দরকার; যদি আপনার ট্রেডিং অ্যালগরিদম প্রতিযোগিতার চেয়ে 0.1 মিমি দ্রুত ফলাফল পেতে পারে তবে আপনি কেনা বেচা / স্টপ-লোকস / কোট কমান্ডের কাতারে আরও ভাল ফলাফল করুন। 3 সেকেন্ড একটি চিরন্তন। এ কারণেই ব্যবসায়ীরা অত্যন্ত ভাল কম্পিউটারে বিনিয়োগ করে। আগের উত্তরটি দেখুন; ক্রিপ্ট.আরএনজি নতুন সংখ্যায় কেবল 0,0028 এমএস নেয়; 0.0000028 সেকেন্ড, সুতরাং আপনি কত প্রসেসিং গ্রহণ করবেন তার বিচারে এবং 9 গতি কতটা গতিযুক্ত তা নয়, আপনি 9 টি প্রশস্ততার অর্ডার বন্ধ করেছেন।
হেনরিক

9

মনে রাখবেন যে সি # তে সিস্টেম.র্যান্ডম ক্লাসটি ভুলভাবে কোড করা হয়েছে, তাই এড়ানো উচিত।

https://connect.microsoft.com/VisualStudio/feedback/details/634761/system-random-serious-bug#tabs


... এবং এটি ঠিক করা সম্ভব হবে না বলে মনে হচ্ছে না।
ব্যয়কারী

4
মাইক্রোসফ্ট "সংযুক্ত" অবসর নিয়েছে বলে মনে হচ্ছে লিঙ্কটি বন্ধ রয়েছে।
এমসিফার্ট

4

প্রত্যেকেরই ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত র্যান্ডম সংখ্যার প্রয়োজন হয় না এবং তারা আরও দ্রুত প্লেইন প্রিং থেকে আরও বেশি উপকৃত হতে পারে। সম্ভবত আরও গুরুত্বপূর্ণটি হ'ল আপনি সিস্টেম.র্যান্ডম সংখ্যার ক্রমটি নিয়ন্ত্রণ করতে পারেন।

আপনি পুনরায় তৈরি করতে চাইতে পারেন এমন এলোমেলো সংখ্যা ব্যবহার করে একটি সিমুলেশনে আপনি একই বীজের সাথে সিমুলেশনটি পুনরায় চালু করেন। আপনি যখন কোনও প্রদত্ত ত্রুটিযুক্ত দৃশ্যের পাশাপাশি পুনরুত্পাদন করতে চান - আপনার প্রোগ্রামটি ক্র্যাশ করে এমন এলোমেলো সংখ্যার ঠিক একই ধারাবাহিকতায় আপনার প্রোগ্রামটি চালানো যখন আপনার বাগ ট্র্যাকিংয়ের পক্ষে কার্যকর হয়।


2

যদি আমার সুরক্ষাটির প্রয়োজন না হয়, যেমন, আমি কেবল একটি অপেক্ষাকৃত অনির্দিষ্ট মান চাই যা ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী নয়, র্যান্ডমটির ব্যবহারের জন্য আরও সহজ ইন্টারফেস রয়েছে।


2

বিভিন্ন আরএনজির জন্য বিভিন্ন প্রয়োজনের জন্য কল। ক্রিপ্টো এর জন্য, আপনি চান আপনার এলোমেলো সংখ্যা যতটা সম্ভব এলোমেলো হোক। মন্টি কার্লো সিমুলেশনগুলির জন্য, আপনি চান যে তারা স্থান সমানভাবে পূরণ করবে এবং একটি পরিচিত রাষ্ট্র থেকে আরএনজি শুরু করতে সক্ষম হবে।


4
যদি কেবল সিস্টেম.র্যান্ডম হয় না .. ওহ, ভাল।
ব্যবহারকারী 2864740

2

Random এটি কোনও এলোমেলো সংখ্যার জেনারেটর নয়, এটি একটি ডিস্ট্রিমেন্টিক সিউডো-র্যান্ডম সিকোয়েন্স জেনারেটর, যা nameতিহাসিক কারণে এটির নাম নেয়।

ব্যবহারের কারণটি System.Randomহ'ল যদি আপনি এই বৈশিষ্ট্যগুলি চান, অর্থাত্‍ একটি ডিটারমিনিস্টিক সিকোয়েন্স, যা একই বীজের সাথে আরম্ভ করার পরে ফলাফলের একই ক্রম উত্পাদন করার গ্যারান্টিযুক্ত।

আপনি যদি ইন্টারফেসের ত্যাগ ছাড়াই "এলোমেলোতা" উন্নতি করতে চান, আপনি System.Randomবেশ কয়েকটি পদ্ধতিকে ওভাররাইড করে উত্তরাধিকারী হতে পারেন ।

আপনি কেন একটি নিয়ামবাদী ক্রম চান?

সত্যিকারের এলোমেলোতার চেয়ে নিয়মিতবাদী ক্রম থাকার একটি কারণ হ'ল এটি পুনরাবৃত্তিযোগ্য repeat

উদাহরণস্বরূপ, আপনি যদি একটি সংখ্যাসূচক সিমুলেশন চালাচ্ছেন তবে আপনি ক্রমিকটি একটি (সত্য) এলোমেলো সংখ্যার সাহায্যে আরম্ভ করতে পারেন এবং কোন নম্বরটি ব্যবহৃত হয়েছিল তা রেকর্ড করতে পারেন

তারপরে, আপনি যদি একই একই সিমুলেশনটির পুনঃনির্ধারণ করতে চান , উদাহরণস্বরূপ ডিবাগিং উদ্দেশ্যে, আপনি এটি রেকর্ডের সাথে ক্রমটি সূচনা করে শুরু করতে পারেন মানটির ।

আপনি কেন এই বিশেষটি চান, খুব ভাল নয়, ক্রম

আমি কেবলমাত্র এই কারণটি এই কোডটি ব্যবহার করে বিদ্যমান কোডের সাথে পিছনের সামঞ্জস্যের জন্য ভাবতে পারি।

সংক্ষেপে, আপনি যদি নিজের বাকী কোডটি না পরিবর্তন করে ক্রমটি উন্নত করতে চান তবে এগিয়ে যান।


1

আমি একটি গেম লিখেছি (আইফোনে ক্রিস্টাল স্লাইডার: এখানে) ) যা মানচিত্রে একটি "এলোমেলো" রত্ন (চিত্রগুলি) রাখবে এবং আপনি মানচিত্রটি কীভাবে চান তা ঘোরাবেন এবং সেগুলি নির্বাচন করুন এবং তারা চলে গেল। - বেজেওয়েলেডের মতো। আমি র্যান্ডম () ব্যবহার করছিলাম এবং ফোনটি বুট হওয়ার পরে এটি 100ns টিকের সংখ্যার সাথে বদ্ধ হয়েছিল, এটি একটি দুর্দান্ত র্যান্ডম বীজ।

আমি এটি আশ্চর্যজনক পেয়েছি যে এটি 2 টি রঙের 90 বা তত রত্নগুলির মধ্যে একে অপরের সাথে প্রায় একই রকম গেম তৈরি করে, আমি 1 থেকে 3 রত্ন ব্যতীত দুটি ঠিক একই রকম পেতে পারি! আপনি যদি 90 টি কয়েন ফ্লিপ করেন এবং 1-3 ফ্লিপ ব্যতীত একই প্যাটার্নটি পান তবে তা খুব সম্ভবত সম্ভাবনা! আমার বেশ কয়েকটি স্ক্রিন শট রয়েছে যা সেগুলি একই দেখায়। সিস্টেমটি কত খারাপ ছিল দেখে আমি হতবাক হয়ে গেলাম। আমি ধরে নিয়েছি, আমার কোডটিতে ভয়াবহ কিছু ভুল লিখেছি এবং এটি ভুল ব্যবহার করছি। যদিও আমি ভুল ছিলাম, এটি জেনারেটর ছিল।

একটি পরীক্ষা হিসাবে - এবং একটি চূড়ান্ত সমাধান হিসাবে, আমি এলোমেলো নম্বর জেনারেটরটিতে ফিরে গিয়েছিলাম যা আমি 1985 বা তার পর থেকে ব্যবহার করে যাচ্ছি - যা খুব ভাল। এটি দ্রুততর হয়, এর পুনরাবৃত্তি হওয়ার আগে এর মেয়াদ 1.3 * 10 ^ 154 (2 ^ 521) রয়েছে। আসল অ্যালগরিদমটি একটি 16 বিট সংখ্যার সাথে বদ্ধ করা হয়েছিল, তবে আমি এটিকে 32 বিট সংখ্যায় পরিবর্তন করেছি এবং প্রাথমিক বদ্ধকরণের উন্নতি করেছি।

আসলটি এখানে:

ftp://ftp.grnet.gr/pub/lang/algorithms/c/jpl-c/random.c

কয়েক বছর ধরে, আমি প্রতিটি এলোমেলো নম্বর পরীক্ষা আমি এটি নিয়ে ভাবতে পেরেছিলাম, এবং এটি তাদের সমস্তেরও অতীত। আমি আশা করি না যে এটি কোনও ক্রিপ্টোগ্রাফিক হিসাবে কোনও মূল্যবান, তবে এটি "রিটার্ন * পি ++;" হিসাবে দ্রুত সংখ্যাকে ফেরত দেয়; যতক্ষণ না এটি 521 বিটগুলির মধ্যে সঞ্চালিত হয় এবং তারপরে এটি নতুন র্যান্ডমগুলি তৈরি করতে বিটগুলির উপর একটি দ্রুত প্রক্রিয়া চালায়।

আমি একটি সি # র‌্যাপার তৈরি করেছি - যাকে বলে জেপিএলআরডম () র্যান্ডম () এর মতো একই ইন্টারফেস বাস্তবায়িত করেছে এবং কোডটিতে আমি যেখানে ডেকেছি সে সমস্ত স্থান পরিবর্তন করেছি।

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

এবং আমি কখনও কখনও System.Random () ব্যবহার করব না anything আমি অবাক হয়েছি যে তাদের সংস্করণটি এমন কিছুর দ্বারা উড়ে গেছে যা এখন 30 বছরের পুরানো!

ট্রেডারহুট গেমস


4
আমার প্রথম অনুমান যে আপনি Randomখুব ঘন ঘন পুনরায় বিনোদন করেছেন। এটি কেবল একবার একবার Nextবহুবার কল করা উচিত । Randomখারাপ, কিন্তু না যে খারাপ। আপনি কি একজোড়া বীজ সহ একটি নমুনা প্রোগ্রাম পোস্ট করতে পারেন যা এই সমস্যাটি দেখায়?
কোডসইনচাউস

কোডটি প্রতিটি স্তরের শুরুতে একটি এলোমেলো () তৈরি করে (তবে এটি পরবর্তী স্তরের তুলনায় 1 স্তরের আরও বড় সমস্যা ছিল) কোডটি মোটামুটি নীচে ছিল:
ট্রেডারহুট গেমস

Rnd = নতুন র‌্যান্ডম ((uint) গেমসিড); নেক্সটগেমসিড = আরআরড.নেক্সট (2000000000); প্রতিটি স্তরে একটি নতুন বীজ তৈরি করা হয়েছিল যা একটি নতুন বীজের সাথে তৈরি হয়েছিল - প্রতিটি স্তরের জন্য বীজ সংরক্ষণ করা হয়েছিল যাতে আমি মানচিত্রটি পুনরায় তৈরি করতে সক্ষম হয়েছি এবং এলোমেলো বীজের মিলের ক্রমটিও নিশ্চিত করতে পারি। এটি আমাকে নিশ্চিত করতে সহায়তা করে যে গেমটি মানচিত্রের একটি বৈধ সিরিজ যা গেমটি সমাধান ও পুনরায় তৈরি করা হয়েছে।
ট্রেডারহুট গেমস

এবং প্রাথমিকভাবে, System.DateTime.Now.Ticks (বা 0) এর উপর ভিত্তি করে র্যান্ডম তৈরি করা হয়েছিল এবং তারপরে উপরের রেন্ডস.নেক্সট () হিসাবে একই কলটি ব্যবহার করে গেমসিডটি বেছে নেওয়া হয়েছিল। যদি আমি এটি করতে না পারি, তবে এলোমেলো নম্বর জেনারেটরের সিডিংয়ের সাথে একটি গুরুতর সমস্যা রয়েছে।
ট্রেডারহুট গেমস

এটি মূল প্রশ্নের উত্তর নয়!
মাইক ডাইনস্কু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.