Random DateTime between range - not unified output
I implemented the below RandomDate, but I always keep getting values closed to "From" date, i probably miss something here....
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;
}
Solution 1:
You could change to:
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;
}
Explanation: I used NextDouble()
because it gives a number between 0.0
and 1.0
. Your return value won't be a whole number of seconds in my solution. And I moved rnd
out to a field on the class/struct. Because it's best to reuse one Random
instance, and not create a new one every time one needs just one additional random number.
Solution 2:
The problem is that:
var randTimeSpan = new TimeSpan((long)(range.TotalSeconds - rnd.Next(0, (int)range.TotalSeconds)));
is creating a TimeSpan from TICKS, not from SECONDS.
You need:
var randTimeSpan = TimeSpan.FromSeconds((long)(range.TotalSeconds - rnd.Next(0, (int)range.TotalSeconds)));
(Please check the cast too - it needs to be a double passed to FromSeconds)
Solution 3:
This is because TimeSpan
's constructor that takes a long
expects ticks, not seconds.
var randTimeSpan = new TimeSpan(range.Ticks - rnd.Next(0, range.Ticks));