[AccessD] Create a random date/time
Bill Benson
bensonforums at gmail.com
Sat Aug 29 13:55:58 CDT 2015
There is a flaw in that function. Consider this for the current date
Sub testformula()
Dim dt As Date
Dim i As Long
Dim dttemp As Date
dt = Date
Dim dtMax As Date
Dim dtMin As Date
dtMin = CDate("1/1/2100")
dtMax = CDate("1/1/1900")
For i = 1 To 1000000#
dttemp = CDate((CLng(dt) - CLng(dt)) * Rnd + CLng(dt) + Rnd)
If dttemp > dtMax Then dtMax = dttemp
If dttemp < dtMin Then dtMin = dttemp
Next
Debug.Print dtMin, dtMax
End Sub
I got an answer of
8/29/2015 8/30/2015
On Sat, Aug 29, 2015 at 2:10 PM, Gustav Brock <gustav at cactus.dk> wrote:
> Hi Stuart
>
> Thanks for the link - you are absolutely right - why didn't I think about
> this?
> While I believe - for the purpose - one could live with this limitation,
> the modification needed is really really simple:
>
> Initial method:
>
> RandomDate = CDate((CLng(UpperDate) - CLng(LowerDate)) * Rnd * Rnd +
> CLng(LowerDate))
>
> Modified as to your suggestion:
>
> RandomDate = CDate((CLng(UpperDate) - CLng(LowerDate)) * Rnd + Rnd +
> CLng(LowerDate))
>
> This is possible because Rnd returns values >= 0 and < 1, exactly matching
> the numeric value range of Time.
>
> The corrected function:
>
> <code>
> Public Function DateRandom( _
> Optional ByVal UpperDate As Date = #12/31/9999#, _
> Optional ByVal LowerDate As Date = #1/1/100#) _
> As Date
>
> ' Generates a random date/time - optionally within the range of
> LowerDate and/or UpperDate.
> '
> ' 2015-08-28. Gustav Brock, Cactus Data ApS, CPH.
> ' 2015-08-29. Modified for uniform distribution as suggested by Stuart
> McLachlan by
> ' combining a random date and a random time.
>
> Dim RandomDate As Date
>
> ' Random date: (CLng(UpperDate) - CLng(LowerDate)) * Rnd +
> CLng(LowerDate)
> ' Random time: Rnd
> RandomDate = CDate((CLng(UpperDate) - CLng(LowerDate)) * Rnd +
> CLng(LowerDate) + Rnd)
>
> DateRandom = RandomDate
>
> End Function
> </code>
>
> /gustav
>
> ________________________________________
> Fra: AccessD <accessd-bounces at databaseadvisors.com> på vegne af Stuart
> McLachlan <stuart at lexacorp.com.pg>
> Sendt: 29. august 2015 03:21
> Til: Access Developers discussion and problem solving
> Emne: Re: [AccessD] Create a random date/time
>
> Rnd * Rnd is NOT a "trick to create a random date/time".
>
> It is a trick to create "more significant digits" than the Single returned
> by a Rnd.
>
> Unfortunately it has a VERY bad side effect. Multiplying random numbers
> together alters the
> probablility distribution.
> http://mathworld.wolfram.com/UniformProductDistribution.html
>
> A better way would be to use Rnd twice in a different way. First to
> generate the Date part and
> a second time to generate the time part, then add then together.
>
> --
> Stuart
>
> On 28 Aug 2015 at 15:29, Gustav Brock wrote:
>
> > Hi all
> >
> > Have you ever wondered how to create a random date/time?
> >
> > Well I hadn't, but it is not that difficult. The trick is using Rnd
> > twice:
> >
> > RandomDate = CDate((CLng(#12/31/9999#) - CLng(#1/1/100#)) * Rnd *
> > Rnd + CLng(#1/1/100#))
> >
> > The full story is here:
> >
> > http://stackoverflow.com/a/32265346/3527297
> >
> > If you want a value within a given range, you can use this simple
> > function:
> >
> > <code>
> > Public Function DateRandom( _
> > Optional ByVal UpperDate As Date = #12/31/9999#, _
> > Optional ByVal LowerDate As Date = #1/1/100#) _
> > As Date
> >
> > ' Generates a random date/time - optionally within the range of
> > LowerDate and/or UpperDate. ' ' 2015-08-28. Gustav Brock, Cactus
> > Data ApS, CPH.
> >
> > Dim RandomDate As Date
> >
> > RandomDate = CDate((CLng(UpperDate) - CLng(LowerDate)) * Rnd * Rnd
> > + CLng(LowerDate))
> >
> > DateRandom = RandomDate
> >
> > End Function
> > </code>
> >
> > /gustav
> --
> AccessD mailing list
> AccessD at databaseadvisors.com
> http://databaseadvisors.com/mailman/listinfo/accessd
> Website: http://www.databaseadvisors.com
>
More information about the AccessD
mailing list