উত্তর:
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
উদাহরণটি রাখা উচিত এবং এটি পুনরায় ব্যবহার করা উচিত। যদি আপনি সময়মতো খুব কাছাকাছি সময়ে নতুন ঘটনা তৈরি করেন তবে তারা এলোমেলো সংখ্যার একই সিরিজ উত্পাদন করবে কারণ সিস্টেম ঘড়ি থেকে এলোমেলো জেনারেটর বীজবদ্ধ হয়।
rnd
হিসাবে ঘোষণা করতে পারেন static
এবং / অথবা সেট করতে পারেন ।
Random
...
Random
আপনার এলোমেলো-নেসকে আরও শক্তিশালী করার জন্য কিছু ভাল "বর্ধন" রয়েছে: ericlippert.com/2019/02/04/fixing-random-part-2 এবং Codeblog.jonskeet.uk/2009/11/04/ পর্যালোচনা -র্যান্ডমনেস ।
প্রশ্নটি খুব সহজ দেখাচ্ছে তবে উত্তরটি কিছুটা জটিল। আপনি যদি দেখেন যে প্রায় সবাই র্যান্ডম ক্লাসটি ব্যবহার করার পরামর্শ দিয়েছেন এবং কেউ কেউ আরএনজি ক্রিপ্টো ক্লাস ব্যবহার করার পরামর্শ দিয়েছেন। তবে তারপরে কখন কী বেছে নেবেন।
তার জন্য আমাদের প্রথমে র্যান্ডমনেস শব্দটি এবং এর পিছনে দর্শনটি বুঝতে হবে।
আমি আপনাকে এই ভিডিওটি দেখার জন্য উত্সাহিত করব যা সি # 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 থেকে দেখুন যেখানে ওএস এনট্রপির যুক্তি ব্যাখ্যা করা হয়েছে। সুতরাং সরল কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কৃপণমান্তে ক্রিপ্টো সিকিওর এলোমেলো সংখ্যা তৈরি করে।
RandomNumberGenerator.Create()
হওয়ায় এর নির্মাণকারীকে কল করার পরিবর্তে এটি ব্যবহার করার পরামর্শ দেওয়া RNGCryptoServiceProvider
হচ্ছে।
প্রতিবার আপনি নতুন এলোমেলো () করলে এটি আরম্ভ করা হয়। এর অর্থ একটি শক্ত লুপে আপনি একই মানটি অনেক বার পান 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);
}
}
Random
জিনিসটি সঞ্চয় করার চেষ্টা করেছি । উভয় ক্ষেত্রেই আমি একই র্যান্ডম নম্বর পেয়েছি। পঙ্কজের কাছাকাছি যাওয়ার সাথে সাথে তা ঘটেনি। সম্ভবত এটি এলোমেলো , তবে আমি এখন এটি সন্দেহ করি। আমি বিভিন্ন থ্রেড থেকে একই দ্বিতীয় এলোমেলো সংখ্যার জন্য জিজ্ঞাসা করছি।
সতর্কতা new Random()
অবলম্বন করুন যা বর্তমান টাইমস্ট্যাম্পে সিড হয়েছে।
আপনি যদি কেবল একটি নম্বর তৈরি করতে চান তবে আপনি ব্যবহার করতে পারেন:
new Random().Next( int.MinValue, int.MaxValue )
আরও তথ্যের জন্য, র্যান্ডম ক্লাসটি দেখুন, তবে দয়া করে নোট করুন:
তবে, কারণ ঘড়ির সীমাবদ্ধ রেজোলিউশন রয়েছে, প্যারামিটারলেস কনস্ট্রাক্টর ব্যবহার করে বিভিন্ন র্যান্ডম অবজেক্টগুলি কাছাকাছি তৈরি করতে এলোমেলো সংখ্যা জেনারেটর তৈরি করে যা এলোমেলো সংখ্যার অভিন্ন ক্রম তৈরি করে
সুতরাং এলোমেলো সংখ্যার একটি সিরিজ উত্পন্ন করতে এই কোডটি ব্যবহার করবেন না।
new Random()
একটি লুপ ব্যবহার না করা একটি গুরুত্বপূর্ণ বিষয়।
আমি একটি ক্রিপ্টোগ্রাফিক সুরক্ষিত সংস্করণ যুক্ত করতে চেয়েছিলাম:
আরএনজিক্রিপ্টো সার্ভিস প্রোভাইডার ক্লাস ( এমএসডিএন বা ডটনেটার্পেলস )
এটি আইডিস্পোজেবল কার্যকর করে।
using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
byte[] randomNumber = new byte[4];//4 for int32
rng.GetBytes(randomNumber);
int value = BitConverter.ToInt32(randomNumber, 0);
}
আপনি ছদ্ম-এলোমেলো সংখ্যার জন্য যে মিস্কিটিল ক্লাস লাইব্রেরিটি তৈরি করেছিলেন তা আপনি জোন স্কিটের স্ট্যাটিকর্যান্ডম পদ্ধতিটি ব্যবহার করতে পারেন ।
using MiscUtil;
...
for (int i = 0; i < 100;
Console.WriteLine(StaticRandom.Next());
আমি এই সব সমাধানের চেষ্টা করেছি সিওবিএল উত্তর বাদ দিয়ে ... হ্যাঁ
এই সমাধানগুলির কোনওটিই যথেষ্ট ভাল ছিল না। ইন লুপের জন্য আমার একটি ফাস্টে এলোমেলো প্রয়োজন এবং আমি খুব প্রশস্ত পরিসরে এমনকি প্রচুর পরিমাণে নকল মান পাচ্ছিলাম। অনেক দীর্ঘ এলোমেলো ফলাফলের জন্য নিষ্পত্তি করার পরে অবশেষে একবার এবং সকলের জন্য এই সমস্যাটি সমাধান করার সিদ্ধান্ত নিয়েছি।
এটা সব বীজ সম্পর্কে।
আমি গাইডের অ অংকগুলি পার্স করে একটি এলোমেলো পূর্ণসংখ্যা তৈরি করি, তারপরে আমি এটি আমার র্যান্ডম ক্লাসটি ইনস্ট্যান্ট করতে ব্যবহার করি।
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);
}
আমি স্বীকার করি আমি এই পদ্ধতিটি আরও ভাল পছন্দ করি।
ইনবিল্ট Random
ক্লাস (সিস্টেম.র্যান্ডম) দ্বারা উত্পন্ন নম্বরগুলি সিউডো এলোমেলো সংখ্যা তৈরি করে।
আপনি যদি সত্যিকারের এলোমেলো সংখ্যা চান তবে আমরা নিকটতম পাই "নিরাপদ সিউডো র্যান্ডম জেনারেটর" যা সি # তে ক্রিপ্টোগ্রাফিক ক্লাস ব্যবহার করে তৈরি করা যেতে পারে RNGCryptoServiceProvider
।
তবুও, আপনি যদি এখনও সত্যিকারের এলোমেলো সংখ্যার প্রয়োজন হয় তবে আপনাকে একটি বাহ্যিক উত্স যেমন র্যান্ডম সংখ্যা জেনারেটরের বীজ হিসাবে তেজস্ক্রিয় ক্ষয়ের জন্য অ্যাকাউন্টিংয়ের ডিভাইসগুলি ব্যবহার করতে হবে। যেহেতু, সংজ্ঞা অনুসারে, খাঁটি অ্যালগরিদমিক উপায়ে উত্পন্ন কোনও সংখ্যা সত্যই এলোমেলো হতে পারে না।
সত্যিকারের এলোমেলো সংখ্যা নিশ্চিত করার জন্য, বর্তমান মিলিসেকেন্ডগুলির সাথে র্যান্ডম অবজেক্টটি বীজ করা ভাল এবং আপনি প্রায়শই এটি বহুবার ব্যবহার করে নকল পাবেন না
Random rand = new Random(DateTime.Now.Millisecond);
হালনাগাদ
আমি জানি যে new Random()
বর্তমান টিকেটগুলি বীজ হিসাবে ব্যবহার করে, তবে বর্তমান মিলিসেকেন্ডগুলির সাথে বীজ বপন করা এটি যথেষ্ট ভাল কারণ এটি এলোমেলো শুরু as
শেষের পয়েন্টটি হ'ল new Random()
প্রতিটি বার যখন আপনাকে এলোমেলো সংখ্যার প্রয়োজন হয় তখনই আপনাকে আরম্ভ করতে হবে না , একটি এলোমেলো বস্তু শুরু করুন তারপরে লুপের ভিতরে যতবার প্রয়োজন বা যত যা প্রয়োজন ব্যবহার করুন
new Random()
বর্তমান টিকটিকে বীজ হিসাবে ব্যবহার করে। আপনি যখন একই মিলিসেকেন্ডে (টিকের বিপরীতে) একাধিক উদাহরণ ইনস্ট্যান্ট করেন, তখন আপনি একই মানটি ফেরত পাবেন।
এখান থেকে পরিবর্তিত উত্তর ।
আপনার যদি একটি ইন্টেল সিকিউর কী সুসংগত সিপিইউতে অ্যাক্সেস থাকে তবে আপনি এই লাইব্রেরিগুলি ব্যবহার করে প্রকৃত র্যান্ডম নম্বর এবং স্ট্রিং তৈরি করতে পারেন: 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>");
যদিও এটি ঠিক আছে:
Random random = new Random();
int randomNumber = random.Next()
আপনি বেশিরভাগ সময় সীমা (ন্যূনতম এবং সর্বাধিক সংখ্যা) নিয়ন্ত্রণ করতে চান। সুতরাং এলোমেলো সংখ্যাটি কোথায় শুরু এবং শেষ হবে তা আপনাকে নির্দিষ্ট করতে হবে।
Next()
পদ্ধতি দুটি প্যারামিটার, সর্বনিম্ন ও সর্বোচ্চ গ্রহণ করে।
সুতরাং আমি যদি চাই যে আমার এলোমেলো সংখ্যাটি 5 এবং 15 বলার মধ্যে হয় তবে আমি ঠিক করব
int randomNumber = random.Next(5, 16)
এই আমি ব্যবহার ক্লাস। মত কাজ করে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);
}
}
প্রতিবার নতুন এলোমেলো জেনারেটর ব্যবহার করা হলে কী হয় তা আমি প্রদর্শন করতে চেয়েছিলাম। ধরুন আপনার দুটি পদ্ধতি বা দুটি ক্লাস রয়েছে যার জন্য একটি এলোমেলো সংখ্যার প্রয়োজন। এবং নির্লজ্জভাবে আপনি তাদের কোড করুন:
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; }
}
RNGCryptoServiceProvider
যাইহোক এটি একটি ভাল কল।
শক্তিশালী এলোমেলো বীজের জন্য আমি সর্বদা ক্রিপ্টোআরএনজি ব্যবহার করি এবং সময় নয়।
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);
}
}
}
Random random = new Random ();
int randomNumber = random.Next (lowerBound,upperBound);
ভবিষ্যতের রেফারেন্সের জন্য ঠিক যেমন একটি নোট।
আপনি যদি .NET কোর ব্যবহার করছেন তবে একাধিক র্যান্ডম উদাহরণ আগের মতো বিপজ্জনক নয়। আমি জানি যে এই প্রশ্নটি ২০১০ সালের, তবে যেহেতু এই প্রশ্নটি পুরানো তবে কিছুটা আকর্ষণ আছে, তাই আমি মনে করি যে পরিবর্তনটি নথিভুক্ত করা ভাল জিনিস।
আপনি এই প্রশ্নটি উল্লেখ করতে পারেন আমি কিছুক্ষণ আগেই:
মাইক্রোসফ্ট কি এলোমেলো ডিফল্ট বীজ পরিবর্তন করেছে?
মূলত, তারা ডিফল্ট বীজ থেকে পরিবর্তিত Environment.TickCount
হয়েছে Guid.NewGuid().GetHashCode()
, সুতরাং আপনি যদি এলোমেলোভাবে 2 টি উদাহরণ তৈরি করেন তবে এটি একই সংখ্যা প্রদর্শন করবে না।
আপনি নেট নেট ফ্রেমওয়ার্ক /। নেট কোর (২.০.০+) থেকে এখানে ফাইলটি দেখতে পান: https://github.com/dotnet/coreclr/pull/2192/commits/9f6a0b675e5ac0065a268554de49162c539ff66d
এটি আরএনজিক্রিপ্টো সার্ভিস প্রোভাইডারের মতো নিরাপদ নয়, তবে কমপক্ষে এটি আপনাকে অদ্ভুত ফলাফল দেবে না।
Interop.GetRandomBytes((byte*)&result, sizeof(int));
।
একটি নির্ধারিত প্রক্রিয়াটির মাধ্যমে কম্পিউটার দ্বারা গণনা করা নম্বরগুলি, সংজ্ঞা অনুসারে এলোমেলো হতে পারে না।
আপনি যদি একটি আসল র্যান্ডম সংখ্যা চান তবে এলোমেলোতা বায়ুমণ্ডলীয় শব্দ এবং তেজস্ক্রিয় ক্ষয় থেকে আসে ay
আপনি উদাহরণস্বরূপ RANDOM.ORG চেষ্টা করতে পারেন (এটি কার্যকারিতা হ্রাস করে)
Random rand = new Random();
int name = rand.Next()
দ্বিতীয় বন্ধনীতে আপনি যে মানটি চান তা রাখুন কোডটি উত্পন্ন করতে প্রপ এবং ডাবল ট্যাব লিখে আপনি একটি নাম স্থাপন করেছেন তা নিশ্চিত করুন
আপনি যদি কোনও সিএসআরএনজি চান যাতে একটি ন্যূনতম এবং সর্বোচ্চের মধ্যে এলোমেলো সংখ্যা তৈরি করতে পারে তবে এটি আপনার জন্য। এটি 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);
}
}
দুঃখিত, ওপি অবশ্যই প্রকৃতপক্ষে একটি এলোমেলো int
মান প্রয়োজন , তবে জ্ঞান ভাগাভাগির সহজ উদ্দেশ্যে আপনি যদি এলোমেলো BigInteger
মান চান তবে আপনি নীচের বিবৃতিটি ব্যবহার করতে পারেন:
BigInteger randomVal = BigInteger.Abs(BigInteger.Parse(Guid.NewGuid().ToString().Replace("-",""), NumberStyles.AllowHexSpecifier));
আমি ধরে নেব যে আপনি নীচের মত অভিন্ন বিতরণ করা এলোমেলো নম্বর জেনারেটর চান। সি # এবং সি ++ সহ বেশিরভাগ প্রোগ্রামিং ভাষার এলোমেলো সংখ্যা তাদের ব্যবহার করার আগে সঠিকভাবে বদলে যায় না। এর অর্থ হ'ল আপনি বারবার একই নম্বর পাবেন যা সত্যই এলোমেলো নয়। বারবার একই সংখ্যা আঁকতে এড়াতে আপনার একটি বীজ লাগবে। সাধারণত, কাজের জন্য টিক্স ঠিক আছে। মনে রাখবেন যে আপনি যদি প্রতিবার একই বীজ ব্যবহার করেন তবে আপনি একই নম্বর বার বার পাবেন। তাই সর্বদা পরিবর্তিত বীজ ব্যবহার করার চেষ্টা করুন। সময় বীজের জন্য একটি ভাল উত্স কারণ তারা সর্বদা তাড়া করে।
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)
সবচেয়ে সহজ উপায় সম্ভবত কেবল Random.range(1, 3)
এটি 1 এবং 2 এর মধ্যে একটি সংখ্যা উত্পন্ন করবে।
আপনি নীচে ব্যবহার করে এলোমেলো বীজ মান দিয়ে চেষ্টা করতে পারেন:
var rnd = new Random(11111111); //note: seed value is 11111111
string randomDigits = rnd.Next();
var requestNumber = $"SD-{randomDigits}";
কেন ব্যবহার int randomNumber = Random.Range(start_range, end_range)
করবেন না ?
বারবার র্যান্ডম এর একটি উদাহরণ ব্যবহার করুন
// 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
কোনও থ্রেড নিরাপদ শ্রেণি নয়। আপনি যদি একটি একক দৃষ্টান্ত তৈরি করেন তবে আপনার লকিং পদ্ধতির পিছনে অ্যাক্সেস সীমাবদ্ধ করা উচিত।
এলোমেলো সংখ্যা তৈরি করতে এই সাধারণ পদক্ষেপগুলি ব্যবহার করে দেখুন:
ফাংশন তৈরি করুন:
private int randomnumber(int min, int max)
{
Random rnum = new Random();
return rnum.Next(min, max);
}
উপরের ফাংশনটি এমন কোনও স্থানে ব্যবহার করুন যেখানে আপনি এলোমেলো নম্বর ব্যবহার করতে চান। মনে করুন আপনি এটি একটি পাঠ্য বাক্সে ব্যবহার করতে চান।
textBox1.Text = randomnumber(0, 999).ToString();
0 মিনিট এবং 999 সর্বোচ্চ। আপনি যা চান মানগুলি পরিবর্তন করতে পারেন।
আমার সর্বদা এমন পদ্ধতি রয়েছে যা এলোমেলো সংখ্যা তৈরি করে যা বিভিন্ন উদ্দেশ্যে সহায়তা করে। আমি আশা করি এটি আপনাকেও সহায়তা করতে পারে:
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();
}
}
দ্রুত এবং ইনলাইনের জন্য সহজ, বেলো কোড ব্যবহার করুন:
new Random().Next(min, max);
// for example unique name
strName += "_" + new Random().Next(100, 999);