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));