मैं 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);
}