[AccessD] Create a random date/time
Gustav Brock
gustav at cactus.dk
Sat Aug 29 13:10:22 CDT 2015
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
More information about the AccessD
mailing list