मैं 1 जनवरी 1995 और वर्तमान तिथि के बीच एक यादृच्छिक तारीख उत्पन्न करने के लिए कुछ सफल, आधुनिक सी # कोड की तलाश कर रहा हूं।
मैं कुछ समाधान सोच रहा हूं जो Enumerable का उपयोग करता है। किसी भी तरह यह अधिक सफल हो सकता है।
मैं 1 जनवरी 1995 और वर्तमान तिथि के बीच एक यादृच्छिक तारीख उत्पन्न करने के लिए कुछ सफल, आधुनिक सी # कोड की तलाश कर रहा हूं।
मैं कुछ समाधान सोच रहा हूं जो Enumerable का उपयोग करता है। किसी भी तरह यह अधिक सफल हो सकता है।
जवाबों:
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();डेट्स पाने के लिए कहते हैं: माइंड कि आपको इसे पाने के लिए फिर से इस्तेमाल करना होगा ताकि जोएल के जवाब से ज्यादा उपयोगी हो।
मैंने @ जोएल कोएहॉर्न उत्तर लिया है और उन परिवर्तनों को जो उन्होंने सलाह दी है - चर को विधि से बाहर रखा और सभी को कक्षा में रखा। इसके अलावा अब समय भी यादृच्छिक है। यहाँ परिणाम है।
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 यादृच्छिक DateTimes लिखने के लिए उपयोग करने के लिए:
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) से शुरू करें, और AddDays के साथ दिनों की एक यादृच्छिक संख्या जोड़ें (मोटे तौर पर, वर्तमान तिथि को पार न करने पर ध्यान दें)।
मुझे खेल में थोड़ी देर हो गई है, लेकिन यहाँ एक समाधान है जो ठीक काम करता है:
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);
}