2013-01-24 6 views
5

मैं RandomDate नीचे लागू किया, लेकिन मैं हमेशा मूल्यों मिलती रहती है "से" तारीख, मैं शायद यहाँ कुछ याद करने बंद कर दिया ....रैंडम दिनांक समय - नहीं एकीकृत उत्पादन

public static DateTime GetRandomDate(DateTime from, DateTime to) 
    { 
     var range = new TimeSpan(to.Ticks - from.Ticks); 

     var rnd = new Random(); 

     var randTimeSpan = new TimeSpan((long)(range.TotalSeconds - rnd.Next(0, (int)range.TotalSeconds))); 

     return from + randTimeSpan; 
    } 
+1

आपकी त्रुटि के लिए (केवल) कारण नहीं होने पर, 'var rnd = new random()' पंक्ति सिरदर्द का कारण बनती है यदि आप अक्सर इस विधि को कॉल करना चाहते हैं। –

+0

इस पोस्ट को देखते हैं? http://stackoverflow.com/questions/767999/random-number- जनरेटर- केवल- जनरेटिंग-one-random- संख्या – Alexxx

उत्तर

20

आप को बदल सकता है मैं NextDouble() इस्तेमाल किया है क्योंकि यह 0.0 और 1.0 के बीच एक संख्या देता है। आपका रिटर्न वैल्यू मेरे समाधान में सेकंड की पूरी संख्या नहीं होगी। और मैं कक्षा/संरचना पर एक क्षेत्र में rnd स्थानांतरित कर दिया। क्योंकि Random इंस्टेंस का पुन: उपयोग करना सबसे अच्छा है, और हर बार एक नया यादृच्छिक संख्या की आवश्यकता नहीं होती है।

+0

ने यह विचार लिया, धन्यवाद। मेरे पास एक थ्रेडलोकल के रूप में यादृच्छिक सदस्य भी था जैसे एलेक्सएक्स ने सुझाव दिया – user1025852

4

समस्या यह है कि है :

var randTimeSpan = new TimeSpan((long)(range.TotalSeconds - rnd.Next(0, (int)range.TotalSeconds))); 

सेकेंड से नहीं, TICKS से टाइमस्पेन बना रहा है।

आप की जरूरत है:

var randTimeSpan = TimeSpan.FromSeconds((long)(range.TotalSeconds - rnd.Next(0, (int)range.TotalSeconds))); 

(भी डाली जांच करें - यह एक डबल FromSeconds के लिए पारित होने की जरूरत है), क्योंकि TimeSpan's constructor that takes a long उम्मीद, टिक्स सेकंड नहीं

+0

यादृच्छिक या तो कक्षा में एक क्षेत्र या इस विधि में एक तर्क होना चाहिए, अन्यथा यह हमेशा बनाया जाता है उसी बीज के साथ जब इस विधि को बहुत तेज़ कहा जाता है (लूप में फी)। –

+0

यह ArgumentOutOfRangeException का कारण बन सकता है जब कुल सेकेंड अधिक है Int32.MaxValue – musium

+0

@ user1320170 वास्तव में, यह केवल 68 वर्ष तक की सीमा तक काम करेगा; हालांकि, ऐसा लगता है कि यह ओपी के लिए पर्याप्त है। –

3

यह वह जगह है।

static readonly Random rnd = new Random(); 
public static DateTime GetRandomDate(DateTime from, DateTime to) 
{ 
    var range = to - from; 

    var randTimeSpan = new TimeSpan((long)(rnd.NextDouble() * range.Ticks)); 

    return from + randTimeSpan; 
} 

स्पष्टीकरण::

var randTimeSpan = new TimeSpan(range.Ticks - rnd.Next(0, range.Ticks)); 
+1

'rnd.Next() 'एक तर्क के रूप में लंबे समय तक नहीं लेता है, केवल int – Acute

0

फिक्स्ड ArgumentOutOfRangeException:

public static DateTime GetRandomDateTime(DateTime? min = null, DateTime? max = null) 
{ 
    min = min ?? new DateTime(1753, 01, 01); 
    max = max ?? new DateTime(9999, 12, 31); 

    var range = max.Value - min.Value; 
    var randomUpperBound = (Int32) range.TotalSeconds; 
    if (randomUpperBound <= 0) 
     randomUpperBound = Rnd.Next(1, Int32.MaxValue); 

    var randTimeSpan = TimeSpan.FromSeconds((Int64) (range.TotalSeconds - Rnd.Next(0, randomUpperBound))); 
    return min.Value.Add(randTimeSpan); 
} 
0

यह मेरे लिए काम कर रहा है। फरवरी के साथ अपवाद से बचने के लिए दिन अंतराल 28 तक है।

Random r = new Random(); 
DateTime rDate = new DateTime(r.Next(1900, 2010), r.Next(1, 12), r.Next(1, 28)); 
0

मेरा विचार हम सिर्फ आरंभ और अंत के बीच में एक यादृच्छिक तारीख पाने के लिए datetime शुरू करने के लिए जोड़ा टिक के कुछ यादृच्छिक संख्या की जरूरत है। तो मेरा समाधान कोई TimeSpan ऑब्जेक्ट्स नहीं बनाता है।

private static readonly Random random = new Random(); 
private static readonly object syncLock = new object(); 

public static DateTime RandomDate(DateTime from, DateTime to) 
{ 
    lock (syncLock) 
    { 
     return from.AddTicks ((long) (random.NextDouble() * (to.Ticks - from.Ticks))); 
    } 
} 
संबंधित मुद्दे