আমি কীভাবে একটি এলোমেলো সংখ্যা নির্ধারণ করতে পারি?


1916

আমি কীভাবে সি # এ এলোমেলো পূর্ণসংখ্যা তৈরি করব?

উত্তর:


2500

Randomবর্গ র্যান্ডম সংখ্যা তৈরি করতে ব্যবহার করা হয়। (সিউডো-এলোমেলো অবশ্যই is

উদাহরণ:

Random rnd = new Random();
int month  = rnd.Next(1, 13);  // creates a number between 1 and 12
int dice   = rnd.Next(1, 7);   // creates a number between 1 and 6
int card   = rnd.Next(52);     // creates a number between 0 and 51

যদি আপনি একাধিক এলোমেলো সংখ্যা তৈরি করতে চলেছেন তবে আপনার Randomউদাহরণটি রাখা উচিত এবং এটি পুনরায় ব্যবহার করা উচিত। যদি আপনি সময়মতো খুব কাছাকাছি সময়ে নতুন ঘটনা তৈরি করেন তবে তারা এলোমেলো সংখ্যার একই সিরিজ উত্পাদন করবে কারণ সিস্টেম ঘড়ি থেকে এলোমেলো জেনারেটর বীজবদ্ধ হয়।


183
ইউনিটি সি # ব্যবহারকারীর জন্য কেবল একটি নোট, আপনাকে অবশ্যই "সিস্টেম.র্যান্ডম ()" নির্দিষ্ট করতে হবে কারণ ইউনিটির একটি "ইউনিটিইজাইন.র্যান্ডম ()" রয়েছে যা সংঘর্ষ (নোট করুন যে "ইউনিটিইজাইন.র্যান্ডম ()" এলোমেলোভাবে উত্পাদন করার ক্ষমতা রাখে না নম্বর)। যেহেতু unityক্য সর্বদা ডিফল্টরূপে সিস্টেম আমদানি করে না এটি কিছু বিভ্রান্তির কারণ হতে পারে।
জোহোত 200

2
এটি পুনরায় ব্যবহার করার জন্য, আপনি কোডটি আরম্ভ করার সময় আপনি একবার rndহিসাবে ঘোষণা করতে পারেন staticএবং / অথবা সেট করতে পারেন ।
জুনিয়র মেহেé

4
@ জুনিয়রএম: হ্যাঁ, আপনি এটি পুনরায় ব্যবহারের জন্য স্থিতিশীল করতে পারেন তবে আপনাকে সতর্ক থাকতে হবে যাতে এটি থ্রেড নিরাপদ না হওয়ায় আপনি এটি একাধিক থ্রেড থেকে অ্যাক্সেস না করতে পারেন (যে কোনও শ্রেণীর ক্ষেত্রে যেমন থ্রেডটি বিশেষভাবে সুরক্ষিত করা হয়নি) )।
গুফা

8
আমি মনে করি এটি অস্বীকার করা যুক্তিযুক্ত দরকারী যে এটি ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত নয়, কারণ এটি একটি জনপ্রিয় প্রশ্ন, যদি কেউ অন্ধভাবে কেউ এর সাথে ক্রিপ্টোগ্রাফি করার চেষ্টা করে Random...
ড্যানিয়েল গার্সিয়া রুবিও

1
দুর্দান্ত উত্তর। Randomআপনার এলোমেলো-নেসকে আরও শক্তিশালী করার জন্য কিছু ভাল "বর্ধন" রয়েছে: ericlippert.com/2019/02/04/fixing-random-part-2 এবং Codeblog.jonskeet.uk/2009/11/04/ পর্যালোচনা -র্যান্ডমনেস
জেসি সি স্লিকার

280

প্রশ্নটি খুব সহজ দেখাচ্ছে তবে উত্তরটি কিছুটা জটিল। আপনি যদি দেখেন যে প্রায় সবাই র্যান্ডম ক্লাসটি ব্যবহার করার পরামর্শ দিয়েছেন এবং কেউ কেউ আরএনজি ক্রিপ্টো ক্লাস ব্যবহার করার পরামর্শ দিয়েছেন। তবে তারপরে কখন কী বেছে নেবেন।

তার জন্য আমাদের প্রথমে র‌্যান্ডমনেস শব্দটি এবং এর পিছনে দর্শনটি বুঝতে হবে।

আমি আপনাকে এই ভিডিওটি দেখার জন্য উত্সাহিত করব যা সি # https://www.youtube.com/watch?v=tCYxc-2-3fY ব্যবহার করে র‌্যান্ডমনেস দর্শনের গভীরতায় যায় watch

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

সি # এলোমেলো

কিছু প্রাথমিক চিন্তা ব্যক্তিদের মনে যায় যা তার পছন্দ সিদ্ধান্ত নেয়, এটি প্রিয় রঙ, ভাগ্যবান রঙ ইত্যাদি হতে পারে। অন্য কথায় কিছু প্রাথমিক ট্রিগার যা আমরা র‌্যাঁডোমকে সিড হিসাবে অভিহিত করি his

এখন যদি একটি বীজ অনুমান করা তারপর র্যান্ডম সংখ্যার ঐ ধরনের হিসাবে বলা হয় সহজ ছদ্ম যখন একটি বীজ ঐ র্যান্ডম সংখ্যা বলা হয় অনুমান করা কঠিন সুরক্ষিত র্যান্ডম সংখ্যা।

উদাহরণস্বরূপ, কোনও ব্যক্তি আবহাওয়া এবং শব্দ সংমিশ্রনের উপর নির্ভর করে রঙ চয়ন করে তবে প্রাথমিক বীজ অনুমান করা কঠিন হবে।

সি # এলোমেলো

এখন আমাকে একটি গুরুত্বপূর্ণ বিবৃতি দেওয়া যাক: -

* "এলোমেলো" শ্রেণি কেবলমাত্র পিএসইউডো র্যান্ডম নম্বর উত্পন্ন করে এবং নিরাপদ র্যান্ডম নম্বর জেনারেট করার জন্য আমাদের "আরএনজিক্রিপ্টো সার্ভিস প্রোভাইডার" শ্রেণিটি ব্যবহার করতে হবে।

সি # এলোমেলো

এলোমেলো শ্রেণি আপনার সিপিইউ ঘড়ি থেকে বীজ মান গ্রহণ করে যা খুব অনুমানযোগ্য। সুতরাং অন্য কথায় সি # র‌্যান্ডম ক্লাস সিউডো এলোমেলো সংখ্যা উত্পন্ন করে, নীচের জন্য একই কোড রয়েছে।

** দ্রষ্টব্য: ** .NET Core 2.0.0+প্যারামিটারলেস কনস্ট্রাক্টারে আলাদা বীজ ব্যবহার করে: সিপিইউ ঘড়ির পরিবর্তে এটি ব্যবহার করে Guid.NewGuid().GetHashCode()

var random = new Random();
int randomnumber = random.Next()

যদিও RNGCryptoServiceProviderবর্গ ব্যবহার ওএস বীজ উৎপাদন করতে এনট্রপি। ওএস এন্ট্রপি একটি এলোমেলো মান যা শব্দ, মাউস ক্লিক এবং কীবোর্ড সময়, তাপ অস্থায়ী ইত্যাদি ব্যবহার করে উত্পন্ন হয় নীচে একই কোডটির জন্য কোডটি দেয়।

using (RNGCryptoServiceProvider rg = new RNGCryptoServiceProvider()) 
{ 
    byte[] rno = new byte[5];    
    rg.GetBytes(rno);    
    int randomvalue = BitConverter.ToInt32(rno, 0); 
}

ওএস এনট্রপি বুঝতে এই ভিডিওটি 14:30 https://www.youtube.com/watch?v=tCYxc-2-3fY থেকে দেখুন যেখানে ওএস এনট্রপির যুক্তি ব্যাখ্যা করা হয়েছে। সুতরাং সরল কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কৃপণমান্তে ক্রিপ্টো সিকিওর এলোমেলো সংখ্যা তৈরি করে।


9
ToInt32 মাত্র 4 বাইটকে পার্স হিসাবে আপনার বাইট [5] মাত্র [4] হওয়া উচিত নয়?
বার্নহার্ড

6
এই ক্লাসগুলি কোথায় থাকে তা জানার জন্য এটি সর্বদা সহায়ক। সিস্টেম.সিকিউরিটি.ক্রিপ্টোগ্রাফি
এল্টন

1
এটি সমস্ত প্ল্যাটফর্মগুলিতে উপলব্ধ না RandomNumberGenerator.Create()হওয়ায় এর নির্মাণকারীকে কল করার পরিবর্তে এটি ব্যবহার করার পরামর্শ দেওয়া RNGCryptoServiceProviderহচ্ছে।
dzitkowskik

আমি কেবল সুনির্দিষ্টভাবে বলতে চাই যে SecureRandom হল ছদ্ম র্যান্ডম প্রজন্ম।
নামমনর

বীজের ক্রমবর্ধমান এলোমেলোতার কারণে, প্রতিবার যখন আমি একটি এলোমেলো সংখ্যা উত্পন্ন করার দরকার হয় তখনই নতুন আরএনজিক্রিপ্টো সার্ভিস প্রোভাইডার অবজেক্ট তৈরি করা ঠিক আছে, বা একটি আরএনজিক্রিপ্টো সার্ভিস প্রোভাইডার অবজেক্ট তৈরি করা এবং পুনরায় ব্যবহার করা যখনই আমাকে এলোমেলো সংখ্যার উত্পন্ন করার দরকার হবে, ঠিক কি র্যান্ডম ক্লাস দিয়ে করা উচিত?
ব্যবহারকারী 2150989

230

প্রতিবার আপনি নতুন এলোমেলো () করলে এটি আরম্ভ করা হয়। এর অর্থ একটি শক্ত লুপে আপনি একই মানটি অনেক বার পান lots আপনার একটি একক এলোমেলো ঘটনা রাখা উচিত এবং একই উদাহরণে পরবর্তী ব্যবহার করা উচিত।

//Function to get random number
private static readonly Random getrandom = new Random();

public static int GetRandomNumber(int min, int max)
{
    lock(getrandom) // synchronize
    {
        return getrandom.Next(min, max);
    }
}

3
@ গুফা 6 মাস আগে তার উত্তরে যা বলেছিল তা কি নয়? "যদি আপনি সময়মতো খুব কাছাকাছি সময়ে নতুন ঘটনা তৈরি করেন, তবে তারা একই ধারাবাহিক এলোমেলো সংখ্যার উত্পাদন করবে"
ক্রিস

3
@ ক্রিস- আপনি যা বলেছেন তা ঠিক right এটিতে আমি এর বাস্তবায়ন সরবরাহ করেছি। আমি মনে করি এটি এটি করার একটি ভাল উপায়। এটি আরও ভাল কাজ করে।
পঙ্কজ মিশ্র

22
এটি এমন একটি বাস্তবায়ন যা সেভাল থ্রেডগুলি থেকে ব্যবহারের জন্য কোডটি সিঙ্ক্রোনাইজ করে। এটি একাধিক থ্রেডযুক্ত অ্যাপ্লিকেশনের জন্য ভাল তবে একক থ্রেডযুক্ত অ্যাপ্লিকেশনের জন্য সময় নষ্ট করা।
গুফা

@ সিয়ান ওয়ার্ল: প্রথমত, আমি গুফার কাছ থেকে এই পদ্ধতির চেষ্টা করেছিলাম। তারপরে আমি একই Randomজিনিসটি সঞ্চয় করার চেষ্টা করেছি । উভয় ক্ষেত্রেই আমি একই র্যান্ডম নম্বর পেয়েছি। পঙ্কজের কাছাকাছি যাওয়ার সাথে সাথে তা ঘটেনি। সম্ভবত এটি এলোমেলো , তবে আমি এখন এটি সন্দেহ করি। আমি বিভিন্ন থ্রেড থেকে একই দ্বিতীয় এলোমেলো সংখ্যার জন্য জিজ্ঞাসা করছি।
পরীক্ষা করা

1
@ টেস্টিং: আমি সম্মত হই যে পঙ্কজের পদ্ধতিটি সঠিকভাবে ব্যবহার করা উচিত। আমি যা বলছি তা হ'ল এটিকে সহজ করা যায়: // এলোমেলো সংখ্যা বেসরকারী স্থিতিশীল পঠনযোগ্য র্যান্ডম getrandom = নতুন র্যান্ডম (); পাবলিক স্ট্যাটিক ইন্ট গেটর্যান্ডম নাম্বার (ইনট মিনিট, ইনট ম্যাক্স) {লক (গেট্রেন্ডম) {// রিটার্ন গিটরেন্ডম.সেক্সক্রোনাইজ করুন। নেক্সট (মিনিট, সর্বাধিক); }}
শান ওয়ারলে

91

সতর্কতা new Random()অবলম্বন করুন যা বর্তমান টাইমস্ট্যাম্পে সিড হয়েছে।

আপনি যদি কেবল একটি নম্বর তৈরি করতে চান তবে আপনি ব্যবহার করতে পারেন:

new Random().Next( int.MinValue, int.MaxValue )

আরও তথ্যের জন্য, র্যান্ডম ক্লাসটি দেখুন, তবে দয়া করে নোট করুন:

তবে, কারণ ঘড়ির সীমাবদ্ধ রেজোলিউশন রয়েছে, প্যারামিটারলেস কনস্ট্রাক্টর ব্যবহার করে বিভিন্ন র্যান্ডম অবজেক্টগুলি কাছাকাছি তৈরি করতে এলোমেলো সংখ্যা জেনারেটর তৈরি করে যা এলোমেলো সংখ্যার অভিন্ন ক্রম তৈরি করে

সুতরাং এলোমেলো সংখ্যার একটি সিরিজ উত্পন্ন করতে এই কোডটি ব্যবহার করবেন না।


40
-1: ডিফল্ট বীজ সময় ভিত্তিক হয়; এটি একটি লুপে করুন এবং আপনি খুব অ-র্যান্ডম ফলাফল পাবেন get আপনি তৈরি করা উচিত এক জেনারেটর এবং এটি আপনার সমস্ত নম্বর, না একটি পৃথক জেনারেটর প্রতিটি সময় জন্য ব্যবহার করুন।
বেভান

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

26
ঠিক আছে, ফর্সা পয়েন্ট। বাতিল। যদিও, আমি এখনও মনে করি যে new Random()একটি লুপ ব্যবহার না করা একটি গুরুত্বপূর্ণ বিষয়।
বেভান

ভবিষ্যতে যাঁরা আসছেন তাদের ক্ষেত্রে এটি এখনই সুস্পষ্ট হওয়া উচিত, তবে আমি কেবল এটি উল্লেখ করব; একাধিক মানের জন্য একটি লুপ এ ব্যবহার না করার জন্য, উত্তরটি এই পয়েন্টটির সাথে আপডেট করা হয়েছিল।
vapcguy


30

আমি একটি ক্রিপ্টোগ্রাফিক সুরক্ষিত সংস্করণ যুক্ত করতে চেয়েছিলাম:

আরএনজিক্রিপ্টো সার্ভিস প্রোভাইডার ক্লাস ( এমএসডিএন বা ডটনেটার্পেলস )

এটি আইডিস্পোজেবল কার্যকর করে।

using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
   byte[] randomNumber = new byte[4];//4 for int32
   rng.GetBytes(randomNumber);
   int value = BitConverter.ToInt32(randomNumber, 0);
}

15

আপনি ছদ্ম-এলোমেলো সংখ্যার জন্য যে মিস্কিটিল ক্লাস লাইব্রেরিটি তৈরি করেছিলেন তা আপনি জোন স্কিটের স্ট্যাটিকর্যান্ডম পদ্ধতিটি ব্যবহার করতে পারেন ।

using MiscUtil;
...

for (int i = 0; i < 100; 
    Console.WriteLine(StaticRandom.Next());

30
আমি কেবল সোর্স কোডটি দেখেছি এবং এই ফাংশনটি ঠিক একই র্যান্ডম নম্বর ইঞ্জিন ব্যবহার করে, এটি সি # তে "অন্তর্ভুক্ত", তবে নিশ্চিত করে যে একই "বীজ" / "মাদার অবজেক্ট" সমস্ত কলের জন্য ব্যবহৃত হয়েছে। (আমি দুঃখিত যে আমি সি # টার্মিনোলজিটি জানি না But তবে আমার
বক্তব্যটি হ'ল এই

5
কোনও কিছুর জন্যই 'সত্যিকারের এলোমেলো' হওয়া অসম্ভব যেহেতু সর্বদা কিছু সীমাবদ্ধ কারণ বা কুসংস্কার থাকে যা এর অস্তিত্বের অন্তর্নিহিত থাকে। আপনি কি বিজ্ঞানের ক্লাসে শিক্ষকের কথা শুনলেন না? ;-)
ফিলি হিলি

যাক, তাঁর মতে এটি 'সত্যই এলোমেলো' হিসাবে এটি পায়
দ্য মিত্র বয়

ভাঙা লিংক এখন। এই কারণেই আপনি আপনার উত্তরের সন্ধানকারী তথ্য অন্তর্ভুক্ত করবেন।
vapcguy

13

আমি এই সব সমাধানের চেষ্টা করেছি সিওবিএল উত্তর বাদ দিয়ে ... হ্যাঁ

এই সমাধানগুলির কোনওটিই যথেষ্ট ভাল ছিল না। ইন লুপের জন্য আমার একটি ফাস্টে এলোমেলো প্রয়োজন এবং আমি খুব প্রশস্ত পরিসরে এমনকি প্রচুর পরিমাণে নকল মান পাচ্ছিলাম। অনেক দীর্ঘ এলোমেলো ফলাফলের জন্য নিষ্পত্তি করার পরে অবশেষে একবার এবং সকলের জন্য এই সমস্যাটি সমাধান করার সিদ্ধান্ত নিয়েছি।

এটা সব বীজ সম্পর্কে।

আমি গাইডের অ অংকগুলি পার্স করে একটি এলোমেলো পূর্ণসংখ্যা তৈরি করি, তারপরে আমি এটি আমার র্যান্ডম ক্লাসটি ইনস্ট্যান্ট করতে ব্যবহার করি।

public int GenerateRandom(int min, int max)
{
    var seed = Convert.ToInt32(Regex.Match(Guid.NewGuid().ToString(), @"\d+").Value);
    return new Random(seed).Next(min, max);
}

আপডেট : আপনি একবার এলোমেলো ক্লাস ইনস্ট্যান্ট করলে বপনের প্রয়োজন হয় না। সুতরাং একটি স্ট্যাটিক ক্লাস তৈরি করা এবং এটি থেকে একটি পদ্ধতি কল করা ভাল '

public static class IntUtil
{
   private static Random random;

   private static void Init()
   {
      if (random == null) random = new Random();
   }

   public static int Random(int min, int max)
   {
      Init();
      return random.Next(min, max);
   }
}

তারপরে আপনি স্ট্যাটিক ক্লাসটি এর মতো ব্যবহার করতে পারেন ..

for(var i = 0; i < 1000; i++)
{
   int randomNumber = IntUtil.Random(1,100);
   Console.WriteLine(randomNumber); 
}

আমি স্বীকার করি আমি এই পদ্ধতিটি আরও ভাল পছন্দ করি।


6
গাইড এলোমেলো নয়, এটি একটি ভাল বীজ নয়। একটি জিইউইডি এলোমেলোতা সম্পর্কে গ্যারান্টি দেয় না, এটি স্বতন্ত্রতার আশেপাশে গ্যারান্টি দেয়। stackoverflow.com/questions/2621563/…
মাগু

2
গাইড একটি ভাল বীজ। আমি কেবল গাইডের নম্বরগুলি ব্যবহার করছি। নিজের জন্য পদ্ধতিটি চেষ্টা করে দেখুন। লুপের জন্য এটি দীর্ঘ দিন এবং নিজের জন্য ফলাফলগুলি দেখুন।
প্রক্সিমো

1
হুম, দ্বিতীয় চিন্তায় .. বীজ মোটেও প্রয়োজন হয় না। উত্তর আপডেট হচ্ছে
প্রক্সিমো

1
আপডেটে দুর্দান্ত পয়েন্ট। আমি এটিকে একটি স্ট্যাটিক ক্ষেত্র হিসাবে তৈরি করার কথা ভাবিওনি, এই উপায়টি আরও ভালভাবে কাজ করে এবং পরিষ্কার।
জিসিসার

1
এই উত্তর নিয়ে কিছু সমস্যা আছে। সবার আগে জিইউডিটি কোনও দুর্দান্ত বীজ উত্স নয় - কারণ এলোমেলো মনে হচ্ছে এর অর্থ এটি নয়। এটি আপনার ব্যক্তিগত প্রয়োজনের জন্য যথেষ্ট ভাল হতে পারে। দ্বিতীয়ত র্যান্ডম ক্লাস থ্রেড নিরাপদ নয়। আপনার প্রতি থ্রেড একবার ইনস্ট্যান্ট করা দরকার।
হেক্টর

11

ইনবিল্ট Randomক্লাস (সিস্টেম.র্যান্ডম) দ্বারা উত্পন্ন নম্বরগুলি সিউডো এলোমেলো সংখ্যা তৈরি করে।

আপনি যদি সত্যিকারের এলোমেলো সংখ্যা চান তবে আমরা নিকটতম পাই "নিরাপদ সিউডো র্যান্ডম জেনারেটর" যা সি # তে ক্রিপ্টোগ্রাফিক ক্লাস ব্যবহার করে তৈরি করা যেতে পারে RNGCryptoServiceProvider

তবুও, আপনি যদি এখনও সত্যিকারের এলোমেলো সংখ্যার প্রয়োজন হয় তবে আপনাকে একটি বাহ্যিক উত্স যেমন র‌্যান্ডম সংখ্যা জেনারেটরের বীজ হিসাবে তেজস্ক্রিয় ক্ষয়ের জন্য অ্যাকাউন্টিংয়ের ডিভাইসগুলি ব্যবহার করতে হবে। যেহেতু, সংজ্ঞা অনুসারে, খাঁটি অ্যালগরিদমিক উপায়ে উত্পন্ন কোনও সংখ্যা সত্যই এলোমেলো হতে পারে না।


11

সত্যিকারের এলোমেলো সংখ্যা নিশ্চিত করার জন্য, বর্তমান মিলিসেকেন্ডগুলির সাথে র্যান্ডম অবজেক্টটি বীজ করা ভাল এবং আপনি প্রায়শই এটি বহুবার ব্যবহার করে নকল পাবেন না

Random rand = new Random(DateTime.Now.Millisecond);

হালনাগাদ

আমি জানি যে new Random()বর্তমান টিকেটগুলি বীজ হিসাবে ব্যবহার করে, তবে বর্তমান মিলিসেকেন্ডগুলির সাথে বীজ বপন করা এটি যথেষ্ট ভাল কারণ এটি এলোমেলো শুরু as

শেষের পয়েন্টটি হ'ল new Random()প্রতিটি বার যখন আপনাকে এলোমেলো সংখ্যার প্রয়োজন হয় তখনই আপনাকে আরম্ভ করতে হবে না , একটি এলোমেলো বস্তু শুরু করুন তারপরে লুপের ভিতরে যতবার প্রয়োজন বা যত যা প্রয়োজন ব্যবহার করুন


5
new Random()বর্তমান টিকটিকে বীজ হিসাবে ব্যবহার করে। আপনি যখন একই মিলিসেকেন্ডে (টিকের বিপরীতে) একাধিক উদাহরণ ইনস্ট্যান্ট করেন, তখন আপনি একই মানটি ফেরত পাবেন।
হ্যানস কে st ইং

10
এটি সক্রিয়ভাবে খারাপ। ডেটটাইম.নিউ.মিলিসেকেন্ড (ডেটটাইম.নো.টিক্সের বিপরীতে) 0 এবং 999 এর মধ্যে একটি সংখ্যা you're আপনি যদি প্রতিটি এলোমেলো সংখ্যার জন্য একটি নতুন একটি তৈরি করে থাকেন তবে আপনার কেবল 1000 সম্ভাবনা থাকবে।
ওরেেন মেলজার

এই উত্তরটি আপ-আপ করার ক্ষেত্রে 24 জন কী ভাবছিলেন ...?
Enigmativity

10

এখান থেকে পরিবর্তিত উত্তর ।

আপনার যদি একটি ইন্টেল সিকিউর কী সুসংগত সিপিইউতে অ্যাক্সেস থাকে তবে আপনি এই লাইব্রেরিগুলি ব্যবহার করে প্রকৃত র্যান্ডম নম্বর এবং স্ট্রিং তৈরি করতে পারেন: https://github.com/JebteK/RdRand এবং https://www.rdrand.com/

কেবল এখান থেকে সর্বশেষতম সংস্করণটি ডাউনলোড করুন , জেবটেক.আরডিআর্যান্ড অন্তর্ভুক্ত করুন এবং এর জন্য একটি ব্যবহারের বিবৃতি যুক্ত করুন। তারপরে, আপনাকে যা করতে হবে তা হ'ল:

// Check to see if this is a compatible CPU
bool isAvailable = RdRandom.GeneratorAvailable();

// Generate 10 random characters
string key       = RdRandom.GenerateKey(10);

 // Generate 64 random characters, useful for API keys 
string apiKey    = RdRandom.GenerateAPIKey();

// Generate an array of 10 random bytes
byte[] b         = RdRandom.GenerateBytes(10);

// Generate a random unsigned int
uint i           = RdRandom.GenerateUnsignedInt();

কোডটি কার্যকর করতে যদি আপনার কাছে কোনও সুসংগত সিপিইউ না থাকে তবে কেবলমাত্র rdrand.com এ RESTful পরিষেবাদি ব্যবহার করুন। আপনার প্রকল্পে অন্তর্ভুক্ত আরডিআরডম র‍্যাপার লাইব্রেরি সহ, আপনাকে কেবল এটি করতে হবে (আপনি সাইনআপ করার সময় 1000 ফ্রি কল পাবেন):

string ret = Randomizer.GenerateKey(<length>, "<key>");
uint ret   = Randomizer.GenerateUInt("<key>");
byte[] ret = Randomizer.GenerateBytes(<length>, "<key>");

7

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

var random = new Random((int)DateTime.Now.Ticks);
var randomValue = random.Next(startValue, endValue + 1);

4

যদিও এটি ঠিক আছে:

Random random = new Random();
int randomNumber = random.Next()

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

Next()পদ্ধতি দুটি প্যারামিটার, সর্বনিম্ন ও সর্বোচ্চ গ্রহণ করে।

সুতরাং আমি যদি চাই যে আমার এলোমেলো সংখ্যাটি 5 এবং 15 বলার মধ্যে হয় তবে আমি ঠিক করব

int randomNumber = random.Next(5, 16)

4

এই আমি ব্যবহার ক্লাস। মত কাজ করেRandomNumber.GenerateRandom(1, 666)

internal static class RandomNumber
{
    private static Random r = new Random();
    private static object l = new object();
    private static Random globalRandom = new Random();
    [ThreadStatic]
    private static Random localRandom;
    public static int GenerateNewRandom(int min, int max)
    {
        return new Random().Next(min, max);
    }
    public static int GenerateLockedRandom(int min, int max)
    {
        int result;
        lock (RandomNumber.l)
        {
            result = RandomNumber.r.Next(min, max);
        }
        return result;
    }
    public static int GenerateRandom(int min, int max)
    {
        Random random = RandomNumber.localRandom;
        if (random == null)
        {
            int seed;
            lock (RandomNumber.globalRandom)
            {
                seed = RandomNumber.globalRandom.Next();
            }
            random = (RandomNumber.localRandom = new Random(seed));
        }
        return random.Next(min, max);
    }
}

আপনার জেনারেটর্যান্ডম ক্লাসটি কখনই 66, never নম্বরটি ফিরিয়ে আনবে না, কেবলমাত্র 656565 টি Rand
গর্ডন বেল

3

প্রতিবার নতুন এলোমেলো জেনারেটর ব্যবহার করা হলে কী হয় তা আমি প্রদর্শন করতে চেয়েছিলাম। ধরুন আপনার দুটি পদ্ধতি বা দুটি ক্লাস রয়েছে যার জন্য একটি এলোমেলো সংখ্যার প্রয়োজন। এবং নির্লজ্জভাবে আপনি তাদের কোড করুন:

public class A
{
    public A()
    {
        var rnd=new Random();
        ID=rnd.Next();
    }
    public int ID { get; private set; }
}
public class B
{
    public B()
    {
        var rnd=new Random();
        ID=rnd.Next();
    }
    public int ID { get; private set; }
}

আপনি কি মনে করেন দুটি ভিন্ন আইডি পাবেন? নাঃ

class Program
{
    static void Main(string[] args)
    {
        A a=new A();
        B b=new B();

        int ida=a.ID, idb=b.ID;
        // ida = 1452879101
        // idb = 1452879101
    }
}

সমাধানটি সর্বদা একটি একক স্থির র্যান্ডম জেনারেটর ব্যবহার করা। এটার মত:

public static class Utils
{
    public static readonly Random random=new Random();
}

public class A
{
    public A()
    {
        ID=Utils.random.Next();
    }
    public int ID { get; private set; }
}
public class B
{
    public B()
    {
        ID=Utils.random.Next();
    }
    public int ID { get; private set; }
}

আপনি কিভাবে নিরাপদে একটি বীজ চয়ন করবেন?
j72

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

তেজস্ক্রিয় ক্ষয় (যা খুব এলোমেলো) এর উপর ভিত্তি করে সংখ্যার এলোমেলো করে দেওয়ার জন্য একটি ছোট আলফা কণা তেজস্ক্রিয় উত্স এবং একটি ডিটেক্টর (ধোঁয়া ডিটেক্টর কীভাবে কাজ করে) সহ একটি র্যান্ডমাইজার চিপ পাওয়া ভাল cool
j72

3

শক্তিশালী এলোমেলো বীজের জন্য আমি সর্বদা ক্রিপ্টোআরএনজি ব্যবহার করি এবং সময় নয়।

using System;
using System.Security.Cryptography;

public class Program
{
    public static void Main()
    {
        var random = new Random(GetSeed());
        Console.WriteLine(random.Next());
    }

    public static int GetSeed() 
    {
        using (var rng = new RNGCryptoServiceProvider())
        {
            var intBytes = new byte[4];
            rng.GetBytes(intBytes);
            return BitConverter.ToInt32(intBytes, 0);
        }
    }
}

3
Random random = new Random ();
int randomNumber = random.Next (lowerBound,upperBound);

1
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে সমস্যাটি সমাধান করবেন এবং উদাহরণ বা রেফারেন্স হিসাবে কোডটি কীভাবে সরবরাহ করবেন তা আরও ভাল। কোড-কেবল উত্তরগুলি বিভ্রান্তিকর হতে পারে এবং প্রসঙ্গের অভাব হতে পারে।
রবার্ট কলম্বিয়া

3

ভবিষ্যতের রেফারেন্সের জন্য ঠিক যেমন একটি নোট।

আপনি যদি .NET কোর ব্যবহার করছেন তবে একাধিক র্যান্ডম উদাহরণ আগের মতো বিপজ্জনক নয়। আমি জানি যে এই প্রশ্নটি ২০১০ সালের, তবে যেহেতু এই প্রশ্নটি পুরানো তবে কিছুটা আকর্ষণ আছে, তাই আমি মনে করি যে পরিবর্তনটি নথিভুক্ত করা ভাল জিনিস।

আপনি এই প্রশ্নটি উল্লেখ করতে পারেন আমি কিছুক্ষণ আগেই:

মাইক্রোসফ্ট কি এলোমেলো ডিফল্ট বীজ পরিবর্তন করেছে?

মূলত, তারা ডিফল্ট বীজ থেকে পরিবর্তিত Environment.TickCountহয়েছে Guid.NewGuid().GetHashCode(), সুতরাং আপনি যদি এলোমেলোভাবে 2 টি উদাহরণ তৈরি করেন তবে এটি একই সংখ্যা প্রদর্শন করবে না।

আপনি নেট নেট ফ্রেমওয়ার্ক /। নেট কোর (২.০.০+) থেকে এখানে ফাইলটি দেখতে পান: https://github.com/dotnet/coreclr/pull/2192/commits/9f6a0b675e5ac0065a268554de49162c539ff66d

এটি আরএনজিক্রিপ্টো সার্ভিস প্রোভাইডারের মতো নিরাপদ নয়, তবে কমপক্ষে এটি আপনাকে অদ্ভুত ফলাফল দেবে না।


এটি এখন সেকেলে। গাইডগুলি ব্যবহার করার বিরুদ্ধে যথেষ্ট প্রতিক্রিয়া হয়েছিল। কোডটি এখন Interop.GetRandomBytes((byte*)&result, sizeof(int));
Enigmativity

2

একটি নির্ধারিত প্রক্রিয়াটির মাধ্যমে কম্পিউটার দ্বারা গণনা করা নম্বরগুলি, সংজ্ঞা অনুসারে এলোমেলো হতে পারে না।

আপনি যদি একটি আসল র্যান্ডম সংখ্যা চান তবে এলোমেলোতা বায়ুমণ্ডলীয় শব্দ এবং তেজস্ক্রিয় ক্ষয় থেকে আসে ay

আপনি উদাহরণস্বরূপ RANDOM.ORG চেষ্টা করতে পারেন (এটি কার্যকারিতা হ্রাস করে)


2
Random rand = new Random();
int name = rand.Next()

দ্বিতীয় বন্ধনীতে আপনি যে মানটি চান তা রাখুন কোডটি উত্পন্ন করতে প্রপ এবং ডাবল ট্যাব লিখে আপনি একটি নাম স্থাপন করেছেন তা নিশ্চিত করুন


1
প্রোপ এবং ডাবল ট্যাব?
ডিসিএসনন

প্রোপ এবং ডাবল ট্যাব কেন ? আপনি কি কিবোর্ড শর্টকাট ছাড়াই বলছেন, যা সম্পত্তিটির জন্য স্বল্প হাত , আপনার কোডটি কাজ করবে না?
Sнаđошƒаӽ

2

আপনি যদি কোনও সিএসআরএনজি চান যাতে একটি ন্যূনতম এবং সর্বোচ্চের মধ্যে এলোমেলো সংখ্যা তৈরি করতে পারে তবে এটি আপনার জন্য। এটি Randomনিরাপদ এলোমেলো বীজের সাথে ক্লাস শুরু করবে ।

    class SecureRandom : Random
    {
        public static byte[] GetBytes(ulong length)
        {
            RNGCryptoServiceProvider RNG = new RNGCryptoServiceProvider();
            byte[] bytes = new byte[length];
            RNG.GetBytes(bytes);
            RNG.Dispose();
            return bytes;
        }
        public SecureRandom() : base(BitConverter.ToInt32(GetBytes(4), 0))
        {

        }
        public int GetRandomInt(int min, int max)
        {
            int treashold = max - min;
            if(treashold != Math.Abs(treashold))
            {
                throw new ArithmeticException("The minimum value can't exceed the maximum value!");
            }
            if (treashold == 0)
            {
                throw new ArithmeticException("The minimum value can't be the same as the maximum value!");
            }
            return min + (Next() % treashold);
        }
        public static int GetRandomIntStatic(int min, int max)
        {
            int treashold = max - min;
            if (treashold != Math.Abs(treashold))
            {
                throw new ArithmeticException("The minimum value can't exceed the maximum value!");
            }
            if(treashold == 0)
            {
                throw new ArithmeticException("The minimum value can't be the same as the maximum value!");
            }
            return min + (BitConverter.ToInt32(GetBytes(4), 0) % treashold);
        }
    }

1

দুঃখিত, ওপি অবশ্যই প্রকৃতপক্ষে একটি এলোমেলো intমান প্রয়োজন , তবে জ্ঞান ভাগাভাগির সহজ উদ্দেশ্যে আপনি যদি এলোমেলো BigIntegerমান চান তবে আপনি নীচের বিবৃতিটি ব্যবহার করতে পারেন:

BigInteger randomVal = BigInteger.Abs(BigInteger.Parse(Guid.NewGuid().ToString().Replace("-",""), NumberStyles.AllowHexSpecifier));

0

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

int GetRandomNumber(int min, int max)
{
    Random rand = new Random((int)DateTime.Now.Ticks);
    return rand.Next(min, max);
}

আপনি যদি সাধারণ বিতরণের জন্য এলোমেলো সংখ্যা জেনারেটর সন্ধান করেন তবে আপনি একটি বক্স-মুলার রূপান্তর ব্যবহার করতে পারেন। এলোমেলো গাউসীয় পরিবর্তনশীল প্রশ্নে yoyoyoyosef দ্বারা উত্তর পরীক্ষা করুন Check আপনি যেহেতু পূর্ণসংখ্যা চান তাই আপনাকে শেষে পূর্ণসংখ্যার দ্বিগুণ মান দিতে হবে।

Random rand = new Random(); //reuse this if you are generating many
double u1 = 1.0-rand.NextDouble(); //uniform(0,1] random doubles
double u2 = 1.0-rand.NextDouble();
double randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) *
         Math.Sin(2.0 * Math.PI * u2); //random normal(0,1)
double randNormal =
         mean + stdDev * randStdNormal; //random normal(mean,stdDev^2)

র্যান্ডম গাউসিয়ান ভেরিয়েবলস


0

সবচেয়ে সহজ উপায় সম্ভবত কেবল Random.range(1, 3)এটি 1 এবং 2 এর মধ্যে একটি সংখ্যা উত্পন্ন করবে।


-1

আপনি নীচে ব্যবহার করে এলোমেলো বীজ মান দিয়ে চেষ্টা করতে পারেন:

var rnd = new Random(11111111); //note: seed value is 11111111

string randomDigits = rnd.Next();

var requestNumber = $"SD-{randomDigits}";

এই স্নিপেটটি দেখার জন্য @ মিকায়েলডিজি ব্লেন্ডারকে ধন্যবাদ
রেজওয়ানুল রেজা

-2

কেন ব্যবহার int randomNumber = Random.Range(start_range, end_range)করবেন না ?


প্রকৃতপক্ষে র্যান্ডম নাম্বার = এলোমেলো.র্যাঞ্জ (শুরু_আরঞ্জন, শেষ_আরঞ্জ +1)
গর্ডন বেল

3
র্যান্ডম.রেঞ্জ () কি বিদ্যমান? আমি এটি এমএসডিএন ডকুমেন্টেশনে খুঁজে পাইনি।
ফিলিপ এনগান

আমি এমএসডিএন ডকুমেন্টেশনেও এলোমেলোভাবে। রেঞ্জ () খুঁজে পাইনি
user2455111

-2

বারবার র্যান্ডম এর একটি উদাহরণ ব্যবহার করুন

// Somewhat better code...
Random rng = new Random();
for (int i = 0; i < 100; i++)
{
    Console.WriteLine(GenerateDigit(rng));
}
...
static int GenerateDigit(Random rng)
{
    // Assume there'd be more logic here really
    return rng.Next(10);
}

এই নিবন্ধটি এলোমেলো করে কেন এলোমেলোভাবে এতগুলি সমস্যা সৃষ্টি করে এবং কীভাবে সেগুলি সমাধান করা যায় at http://csharpindepth.com/Articles/Chapter12/Random.aspx


Randomকোনও থ্রেড নিরাপদ শ্রেণি নয়। আপনি যদি একটি একক দৃষ্টান্ত তৈরি করেন তবে আপনার লকিং পদ্ধতির পিছনে অ্যাক্সেস সীমাবদ্ধ করা উচিত।
ব্র্যাড এম

-2

এলোমেলো সংখ্যা তৈরি করতে এই সাধারণ পদক্ষেপগুলি ব্যবহার করে দেখুন:

ফাংশন তৈরি করুন:

private int randomnumber(int min, int max)
{
    Random rnum = new Random();
    return rnum.Next(min, max);
}

উপরের ফাংশনটি এমন কোনও স্থানে ব্যবহার করুন যেখানে আপনি এলোমেলো নম্বর ব্যবহার করতে চান। মনে করুন আপনি এটি একটি পাঠ্য বাক্সে ব্যবহার করতে চান।

textBox1.Text = randomnumber(0, 999).ToString();

0 মিনিট এবং 999 সর্বোচ্চ। আপনি যা চান মানগুলি পরিবর্তন করতে পারেন।


সিস্টেম সময়কে বীজ হিসাবে ব্যবহার করার সাথে সাথে একত্রে একাধিকবার কল করা হলে এটি একই সংখ্যাটি ফিরে আসবে ...
MOnsDaR

1
এলোমেলো সংখ্যা (0, 999) কখনই 999 ফেরত আসবে না Max সর্বোচ্চ মানটি অন্তর্ভুক্ত নয়। এটি র্যান্ডম.নেক্সট সর্বাধিক মানের সাধারণ ভুল বোঝাবুঝি (বৈশিষ্ট্য)।
গর্ডন বেল

-2

আমার সর্বদা এমন পদ্ধতি রয়েছে যা এলোমেলো সংখ্যা তৈরি করে যা বিভিন্ন উদ্দেশ্যে সহায়তা করে। আমি আশা করি এটি আপনাকেও সহায়তা করতে পারে:

public class RandomGenerator  
{  
    public int RandomNumber(int min, int max)  
    {  
        var random = new Random();  
        return random.Next(min, max);  
    }  

    public string RandomString(int size, bool lowerCase)  
    {  
        var builder = new StringBuilder();  
        var random  = new Random();  
        char ch;  

        for (int i = 0; i < size; i++)  
        {  
            ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));  
            builder.Append(ch);  
        }  

        if (lowerCase)  
            return builder.ToString().ToLower();  
        return builder.ToString();  
    }  
}

-3

দ্রুত এবং ইনলাইনের জন্য সহজ, বেলো কোড ব্যবহার করুন:

new Random().Next(min, max);

// for example unique name
strName += "_" + new Random().Next(100, 999);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.