আমি 1 জানুয়ারী 1995 থেকে বর্তমান তারিখের মধ্যে একটি এলোমেলো তারিখ উত্পন্ন করতে কিছু সংক্ষিপ্ত, আধুনিক সি # কোড সন্ধান করছি।
আমি এমন কিছু সমাধান বিবেচনা করছি যা গণনাযোগ্যকে কাজে লাগায় an
আমি 1 জানুয়ারী 1995 থেকে বর্তমান তারিখের মধ্যে একটি এলোমেলো তারিখ উত্পন্ন করতে কিছু সংক্ষিপ্ত, আধুনিক সি # কোড সন্ধান করছি।
আমি এমন কিছু সমাধান বিবেচনা করছি যা গণনাযোগ্যকে কাজে লাগায় an
উত্তর:
private Random gen = new Random();
DateTime RandomDay()
{
DateTime start = new DateTime(1995, 1, 1);
int range = (DateTime.Today - start).Days;
return start.AddDays(gen.Next(range));
}
আরও ভাল পারফরম্যান্সের জন্য যদি এটি বারবার বলা হয়, ফাংশনের বাইরেstart
এবং gen
(এবং এমনকি এমনকি range
) ভেরিয়েবলগুলি তৈরি করুন।
এটি কিছুটা আরও অনুকূলিত সংস্করণ তৈরি করার বিষয়ে জোয়েলের মন্তব্যের সামান্য প্রতিক্রিয়া। সরাসরি এলোমেলো তারিখ ফিরিয়ে দেওয়ার পরিবর্তে, কেন এমন কোনও জেনারেটরের ফাংশন ফিরিয়ে আনবেন না যা এলোমেলো তারিখ তৈরি করতে বারবার বলা যেতে পারে।
Func<DateTime> RandomDayFunc()
{
DateTime start = new DateTime(1995, 1, 1);
Random gen = new Random();
int range = ((TimeSpan)(DateTime.Today - start)).Days;
return () => start.AddDays(gen.Next(range));
}
for (int i = 0; i < 100; i++) { array[i].DateProp = RandomDayFunc()(); }
var getRandomDate = RandomDayFunc();
তারপরে আপনি এলোমেলো তারিখগুলি পেতে কল করুন: var randomDate = getRandomDate();
মনে রাখবেন যে জোয়েলের উত্তরের চেয়ে আরও দরকারী হওয়ার জন্য আপনাকে getRandomDate পুনরায় ব্যবহার করতে হবে।
আমি @ জোয়েল কোহুর্নের উত্তর নিয়েছি এবং তার পরামর্শ অনুসারে পরিবর্তনগুলি করেছি - ভেরিয়েবলটি পদ্ধতিটি বাদ দিয়ে সমস্ত কিছু ক্লাসে রেখেছি। প্লাস এখন সময়ও এলোমেলো। ফলাফল এখানে।
class RandomDateTime
{
DateTime start;
Random gen;
int range;
public RandomDateTime()
{
start = new DateTime(1995, 1, 1);
gen = new Random();
range = (DateTime.Today - start).Days;
}
public DateTime Next()
{
return start.AddDays(gen.Next(range)).AddHours(gen.Next(0,24)).AddMinutes(gen.Next(0,60)).AddSeconds(gen.Next(0,60));
}
}
এবং উদাহরণস্বরূপ কনসোলে 100 র্যান্ডম ডেটটাইম লিখতে কীভাবে ব্যবহার করবেন:
RandomDateTime date = new RandomDateTime();
for (int i = 0; i < 100; i++)
{
Console.WriteLine(date.Next());
}
range = (int)(DateTime.Today - start).TotalSeconds;
এবং return start.AddSeconds(gen.Next(range));
।
ঠিক আছে, আপনি যদি বিকল্প অপ্টিমাইজেশন উপস্থাপন করেন তবে আমরা একটি পুনরাবৃত্তিকারীর জন্যও যেতে পারি:
static IEnumerable<DateTime> RandomDay()
{
DateTime start = new DateTime(1995, 1, 1);
Random gen = new Random();
int range = ((TimeSpan)(DateTime.Today - start)).Days;
while (true)
yield return start.AddDays(gen.Next(range));
}
আপনি এটি এর মতো ব্যবহার করতে পারেন:
int i=0;
foreach(DateTime dt in RandomDay())
{
Console.WriteLine(dt);
if (++i == 10)
break;
}
একটি স্থির তারিখ অবজেক্ট (জানুয়ারী 1, 1995) দিয়ে শুরু করুন এবং অ্যাডডেসের সাথে এলোমেলো সংখ্যক দিন যুক্ত করুন (অবরুদ্ধভাবে, বর্তমান তারিখকে অতিক্রম না করে মনোযোগ দিন)।
গেমটি থেকে আমি কিছুটা দেরি করেছি, তবে এখানে একটি সমাধান রয়েছে যা ভাল কাজ করে:
void Main()
{
var dateResult = GetRandomDates(new DateTime(1995, 1, 1), DateTime.UtcNow, 100);
foreach (var r in dateResult)
Console.WriteLine(r);
}
public static IList<DateTime> GetRandomDates(DateTime startDate, DateTime maxDate, int range)
{
var randomResult = GetRandomNumbers(range).ToArray();
var calculationValue = maxDate.Subtract(startDate).TotalMinutes / int.MaxValue;
var dateResults = randomResult.Select(s => startDate.AddMinutes(s * calculationValue)).ToList();
return dateResults;
}
public static IEnumerable<int> GetRandomNumbers(int size)
{
var data = new byte[4];
using (var rng = new System.Security.Cryptography.RNGCryptoServiceProvider(data))
{
for (int i = 0; i < size; i++)
{
rng.GetBytes(data);
var value = BitConverter.ToInt32(data, 0);
yield return value < 0 ? value * -1 : value;
}
}
}
কিছু ছোট পদ্ধতি যা কিছু সাধারণ ইনপুট প্যারামিটারের ভিত্তিতে স্ট্রিং হিসাবে এলোমেলো তারিখ দেয়। উপরের উত্তরগুলি থেকে ভিন্নতার ভিত্তিতে নির্মিত:
public string RandomDate(int startYear = 1960, string outputDateFormat = "yyyy-MM-dd")
{
DateTime start = new DateTime(startYear, 1, 1);
Random gen = new Random(Guid.NewGuid().GetHashCode());
int range = (DateTime.Today - start).Days;
return start.AddDays(gen.Next(range)).ToString(outputDateFormat);
}