804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync/* $Id$ */
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync/** @file
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync * IPRT - Testcase for the RTRand API.
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync */
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync/*
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2008-2011 Oracle Corporation
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync *
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync * available from http://www.virtualbox.org. This file is free software;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync * you can redistribute it and/or modify it under the terms of the GNU
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync * General Public License (GPL) as published by the Free Software
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync *
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync * The contents of this file may alternatively be used under the terms
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync * of the Common Development and Distribution License Version 1.0
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync * VirtualBox OSE distribution, in which case the provisions of the
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync * CDDL are applicable instead of those of the GPL.
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync *
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync * You may elect to license modified versions of this file under the
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync * terms and conditions of either the GPL or the CDDL or both.
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync */
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync/*******************************************************************************
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync* Header Files *
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync*******************************************************************************/
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync#include <iprt/rand.h>
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync#include <iprt/stream.h>
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync#include <iprt/initterm.h>
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync#include <iprt/string.h>
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync#include <iprt/assert.h>
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync/*******************************************************************************
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync* Structures and Typedefs *
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync*******************************************************************************/
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsynctypedef struct TSTMEMAUTOPTRSTRUCT
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync{
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint32_t a;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint32_t b;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint32_t c;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync} TSTMEMAUTOPTRSTRUCT;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync/*******************************************************************************
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync* Defined Constants And Macros *
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync*******************************************************************************/
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync#define CHECK_EXPR(expr) \
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync do { bool const f = !!(expr); if (RT_UNLIKELY(!f)) { RTPrintf("tstRand(%d): %s!\n", __LINE__, #expr); g_cErrors++; } } while (0)
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync#define CHECK_EXPR_MSG(expr, msg) \
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync do { \
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync bool const f = !!(expr); \
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync if (RT_UNLIKELY(!f)) { \
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync RTPrintf("tstRand(%d): %s!\n", __LINE__, #expr); \
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync RTPrintf("tstRand: "); \
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync RTPrintf msg; \
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync if (++g_cErrors > 25) return 1; \
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync } \
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync } while (0)
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync#define TST_RAND_SAMPLE_RANGES 16
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync/*******************************************************************************
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync* Global Variables *
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync*******************************************************************************/
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsyncstatic unsigned g_cErrors = 0;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsyncstatic void tstRandCheckDist(uint32_t *pacHits, unsigned iTest)
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync{
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync RTPrintf("tstRand:");
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint32_t iMin = UINT32_MAX;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint32_t iMax = 0;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint32_t iAvg = 0;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync for (unsigned iRange = 0; iRange < TST_RAND_SAMPLE_RANGES; iRange++)
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync {
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync RTPrintf(" %04RX32", pacHits[iRange]);
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync if (iMax < pacHits[iRange])
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync iMax = pacHits[iRange];
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync if (iMin > pacHits[iRange])
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync iMin = pacHits[iRange];
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync iAvg += pacHits[iRange];
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync }
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync iAvg /= TST_RAND_SAMPLE_RANGES;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync RTPrintf(" min=%RX32 (%%%d) max=%RX32 (%%%d) calc avg=%RX32 [test=%d]\n",
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync iMin, (iAvg - iMin) * 100 / iAvg, iMax,
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync (iMax - iAvg) * 100 / iAvg,
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync iAvg,
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync iTest);
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync CHECK_EXPR(iMin >= iAvg - iAvg / 4);
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync CHECK_EXPR(iMax <= iAvg + iAvg / 4);
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync}
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsyncstatic int tstRandAdv(RTRAND hRand)
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync{
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync /*
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * Test distribution.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync */
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync#if 1
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync /* unsigned 32-bit */
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync static const struct
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync {
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint32_t u32First;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint32_t u32Last;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync } s_aU32Tests[] =
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync {
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 0, UINT32_MAX },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 0, UINT32_MAX / 2 + UINT32_MAX / 4 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 0, UINT32_MAX / 2 + UINT32_MAX / 8 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 0, UINT32_MAX / 2 + UINT32_MAX / 16 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 0, UINT32_MAX / 2 + UINT32_MAX / 64 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 0, UINT32_MAX / 2 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { UINT32_MAX / 4, UINT32_MAX / 4 * 3 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 0, TST_RAND_SAMPLE_RANGES - 1 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 1234, 1234 + TST_RAND_SAMPLE_RANGES - 1 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync };
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync for (unsigned iTest = 0; iTest < RT_ELEMENTS(s_aU32Tests); iTest++)
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync {
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint32_t acHits[TST_RAND_SAMPLE_RANGES] = {0};
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint32_t const uFirst = s_aU32Tests[iTest].u32First;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint32_t const uLast = s_aU32Tests[iTest].u32Last;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint32_t const uRange = uLast - uFirst; Assert(uLast >= uFirst);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint32_t const uDivisor = uRange / TST_RAND_SAMPLE_RANGES + 1;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync RTPrintf("tstRand: TESTING RTRandAdvU32Ex(,%#RX32, %#RX32) distribution... [div=%#RX32 range=%#RX32]\n", uFirst, uLast, uDivisor, uRange);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync for (unsigned iSample = 0; iSample < TST_RAND_SAMPLE_RANGES * 10240; iSample++)
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync {
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint32_t uRand = RTRandAdvU32Ex(hRand, uFirst, uLast);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync CHECK_EXPR_MSG(uRand >= uFirst, ("%#RX32 %#RX32\n", uRand, uFirst));
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync CHECK_EXPR_MSG(uRand <= uLast, ("%#RX32 %#RX32\n", uRand, uLast));
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint32_t off = uRand - uFirst;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync acHits[off / uDivisor]++;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync }
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync tstRandCheckDist(acHits, iTest);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync }
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync#endif
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync#if 1
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync /* unsigned 64-bit */
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync static const struct
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync {
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint64_t u64First;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint64_t u64Last;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync } s_aU64Tests[] =
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync {
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 0, UINT64_MAX },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 0, UINT64_MAX / 2 + UINT64_MAX / 4 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 0, UINT64_MAX / 2 + UINT64_MAX / 8 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 0, UINT64_MAX / 2 + UINT64_MAX / 16 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 0, UINT64_MAX / 2 + UINT64_MAX / 64 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 0, UINT64_MAX / 2 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { UINT64_MAX / 4, UINT64_MAX / 4 * 3 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 0, UINT32_MAX },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 0, UINT32_MAX / 2 + UINT32_MAX / 4 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 0, UINT32_MAX / 2 + UINT32_MAX / 8 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 0, UINT32_MAX / 2 + UINT32_MAX / 16 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 0, UINT32_MAX / 2 + UINT32_MAX / 64 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 0, UINT32_MAX / 2 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { UINT32_MAX / 4, UINT32_MAX / 4 * 3 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 0, TST_RAND_SAMPLE_RANGES - 1 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 1234, 1234 + TST_RAND_SAMPLE_RANGES - 1 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync };
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync for (unsigned iTest = 0; iTest < RT_ELEMENTS(s_aU64Tests); iTest++)
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync {
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint32_t acHits[TST_RAND_SAMPLE_RANGES] = {0};
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint64_t const uFirst = s_aU64Tests[iTest].u64First;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint64_t const uLast = s_aU64Tests[iTest].u64Last;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint64_t const uRange = uLast - uFirst; Assert(uLast >= uFirst);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint64_t const uDivisor = uRange / TST_RAND_SAMPLE_RANGES + 1;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync RTPrintf("tstRand: TESTING RTRandAdvU64Ex(,%#RX64, %#RX64) distribution... [div=%#RX64 range=%#RX64]\n", uFirst, uLast, uDivisor, uRange);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync for (unsigned iSample = 0; iSample < TST_RAND_SAMPLE_RANGES * 10240; iSample++)
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync {
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint64_t uRand = RTRandAdvU64Ex(hRand, uFirst, uLast);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync CHECK_EXPR_MSG(uRand >= uFirst, ("%#RX64 %#RX64\n", uRand, uFirst));
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync CHECK_EXPR_MSG(uRand <= uLast, ("%#RX64 %#RX64\n", uRand, uLast));
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint64_t off = uRand - uFirst;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync acHits[off / uDivisor]++;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync }
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync tstRandCheckDist(acHits, iTest);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync }
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync#endif
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync#if 1
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync /* signed 32-bit */
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync static const struct
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync {
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync int32_t i32First;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync int32_t i32Last;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync } s_aS32Tests[] =
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync {
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { -429496729, 429496729 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT32_MIN, INT32_MAX },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT32_MIN, INT32_MAX / 2 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { -0x20000000, INT32_MAX },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { -0x10000000, INT32_MAX },
a3adbaeff161b554f16f262f728c89e2cf0afcaevboxsync { -0x08000000, INT32_MAX },
a3adbaeff161b554f16f262f728c89e2cf0afcaevboxsync { -0x00800000, INT32_MAX },
a3adbaeff161b554f16f262f728c89e2cf0afcaevboxsync { -0x00080000, INT32_MAX },
a3adbaeff161b554f16f262f728c89e2cf0afcaevboxsync { -0x00008000, INT32_MAX },
a3adbaeff161b554f16f262f728c89e2cf0afcaevboxsync { -0x00000800, INT32_MAX },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 2, INT32_MAX / 2 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 4000000, INT32_MAX / 2 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { -4000000, INT32_MAX / 2 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT32_MIN / 2, INT32_MAX / 2 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT32_MIN / 3, INT32_MAX / 2 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT32_MIN / 3, INT32_MAX / 3 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT32_MIN / 3, INT32_MAX / 4 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT32_MIN / 4, INT32_MAX / 4 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT32_MIN / 5, INT32_MAX / 5 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT32_MIN / 6, INT32_MAX / 6 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT32_MIN / 7, INT32_MAX / 6 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT32_MIN / 7, INT32_MAX / 7 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT32_MIN / 7, INT32_MAX / 8 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT32_MIN / 8, INT32_MAX / 8 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT32_MIN / 9, INT32_MAX / 9 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT32_MIN / 9, INT32_MAX / 12 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT32_MIN / 12, INT32_MAX / 12 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 0, TST_RAND_SAMPLE_RANGES - 1 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { -TST_RAND_SAMPLE_RANGES / 2, TST_RAND_SAMPLE_RANGES / 2 - 1 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync };
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync for (unsigned iTest = 0; iTest < RT_ELEMENTS(s_aS32Tests); iTest++)
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync {
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint32_t acHits[TST_RAND_SAMPLE_RANGES] = {0};
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync int32_t const iFirst = s_aS32Tests[iTest].i32First;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync int32_t const iLast = s_aS32Tests[iTest].i32Last;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint32_t const uRange = iLast - iFirst; AssertMsg(iLast >= iFirst, ("%d\n", iTest));
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint32_t const uDivisor = (uRange ? uRange : UINT32_MAX) / TST_RAND_SAMPLE_RANGES + 1;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync RTPrintf("tstRand: TESTING RTRandAdvS32Ex(,%#RI32, %#RI32) distribution... [div=%#RX32 range=%#RX32]\n", iFirst, iLast, uDivisor, uRange);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync for (unsigned iSample = 0; iSample < TST_RAND_SAMPLE_RANGES * 10240; iSample++)
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync {
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync int32_t iRand = RTRandAdvS32Ex(hRand, iFirst, iLast);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync CHECK_EXPR_MSG(iRand >= iFirst, ("%#RI32 %#RI32\n", iRand, iFirst));
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync CHECK_EXPR_MSG(iRand <= iLast, ("%#RI32 %#RI32\n", iRand, iLast));
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint32_t off = iRand - iFirst;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync acHits[off / uDivisor]++;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync }
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync tstRandCheckDist(acHits, iTest);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync }
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync#endif
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync#if 1
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync /* signed 64-bit */
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync static const struct
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync {
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync int64_t i64First;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync int64_t i64Last;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync } s_aS64Tests[] =
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync {
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN, INT64_MAX },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN, INT64_MAX / 2 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN / 2, INT64_MAX / 2 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN / 2 + INT64_MIN / 4, INT64_MAX / 2 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN / 2 + INT64_MIN / 8, INT64_MAX / 2 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN / 2 + INT64_MIN / 16, INT64_MAX / 2 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN / 2 + INT64_MIN / 64, INT64_MAX / 2 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN / 2 + INT64_MIN / 64, INT64_MAX / 2 + INT64_MAX / 64 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN / 2, INT64_MAX / 2 + INT64_MAX / 64 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN / 2, INT64_MAX / 2 + INT64_MAX / 8 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN / 2, INT64_MAX / 2 - INT64_MAX / 8 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN / 2 - INT64_MIN / 4, INT64_MAX / 2 - INT64_MAX / 4 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN / 2 - INT64_MIN / 4, INT64_MAX / 2 - INT64_MAX / 8 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN / 2 - INT64_MIN / 8, INT64_MAX / 2 - INT64_MAX / 8 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN / 2 - INT64_MIN / 16, INT64_MAX / 2 - INT64_MAX / 8 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN / 2 - INT64_MIN / 16, INT64_MAX / 2 - INT64_MAX / 16 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN / 2 - INT64_MIN / 32, INT64_MAX / 2 - INT64_MAX / 16 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN / 2 - INT64_MIN / 32, INT64_MAX / 2 - INT64_MAX / 32 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN / 2 - INT64_MIN / 64, INT64_MAX / 2 - INT64_MAX / 64 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN / 2 - INT64_MIN / 8, INT64_MAX / 2 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN / 4, INT64_MAX / 4 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN / 5, INT64_MAX / 5 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN / 6, INT64_MAX / 6 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN / 7, INT64_MAX / 7 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT64_MIN / 8, INT64_MAX / 8 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT32_MIN, INT32_MAX },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT32_MIN, INT32_MAX / 2 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { -0x20000000, INT32_MAX },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { -0x10000000, INT32_MAX },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { -0x7f000000, INT32_MAX },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { -0x08000000, INT32_MAX },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { -0x00800000, INT32_MAX },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { -0x00080000, INT32_MAX },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { -0x00008000, INT32_MAX },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 2, INT32_MAX / 2 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 4000000, INT32_MAX / 2 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { -4000000, INT32_MAX / 2 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { INT32_MIN / 2, INT32_MAX / 2 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { 0, TST_RAND_SAMPLE_RANGES - 1 },
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync { -TST_RAND_SAMPLE_RANGES / 2, TST_RAND_SAMPLE_RANGES / 2 - 1 }
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync };
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync for (unsigned iTest = 0; iTest < RT_ELEMENTS(s_aS64Tests); iTest++)
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync {
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint32_t acHits[TST_RAND_SAMPLE_RANGES] = {0};
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync int64_t const iFirst = s_aS64Tests[iTest].i64First;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync int64_t const iLast = s_aS64Tests[iTest].i64Last;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint64_t const uRange = iLast - iFirst; AssertMsg(iLast >= iFirst, ("%d\n", iTest));
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint64_t const uDivisor = (uRange ? uRange : UINT64_MAX) / TST_RAND_SAMPLE_RANGES + 1;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync RTPrintf("tstRand: TESTING RTRandAdvS64Ex(,%#RI64, %#RI64) distribution... [div=%#RX64 range=%#016RX64]\n", iFirst, iLast, uDivisor, uRange);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync for (unsigned iSample = 0; iSample < TST_RAND_SAMPLE_RANGES * 10240; iSample++)
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync {
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync int64_t iRand = RTRandAdvS64Ex(hRand, iFirst, iLast);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync CHECK_EXPR_MSG(iRand >= iFirst, ("%#RI64 %#RI64\n", iRand, iFirst));
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync CHECK_EXPR_MSG(iRand <= iLast, ("%#RI64 %#RI64\n", iRand, iLast));
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync uint64_t off = iRand - iFirst;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync acHits[off / uDivisor]++;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync }
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync tstRandCheckDist(acHits, iTest);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync }
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync#endif
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync /*
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync * Test saving and restoring the state.
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync */
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync RTPrintf("tstRand: TESTING RTRandAdvSave/RestoreSave\n");
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync char szState[256];
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync size_t cbState = sizeof(szState);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync int rc = RTRandAdvSaveState(hRand, szState, &cbState);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync if (rc != VERR_NOT_SUPPORTED)
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync {
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync CHECK_EXPR_MSG(rc == VINF_SUCCESS, ("RTRandAdvSaveState(%p,,256) -> %Rrc (%d)\n", (uintptr_t)hRand, rc, rc));
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync uint32_t const u32A1 = RTRandAdvU32(hRand);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync uint32_t const u32B1 = RTRandAdvU32(hRand);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync RTPrintf("tstRand: state:\"%s\" A=%RX32 B=%RX32\n", szState, u32A1, u32B1);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync rc = RTRandAdvRestoreState(hRand, szState);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync CHECK_EXPR_MSG(rc == VINF_SUCCESS, ("RTRandAdvRestoreState(%p,\"%s\") -> %Rrc (%d)\n", (uintptr_t)hRand, szState, rc, rc));
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync uint32_t const u32A2 = RTRandAdvU32(hRand);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync uint32_t const u32B2 = RTRandAdvU32(hRand);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync CHECK_EXPR_MSG(u32A1 == u32A2, ("u32A1=%RX32 u32A2=%RX32\n", u32A1, u32A2));
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync CHECK_EXPR_MSG(u32B1 == u32B2, ("u32B1=%RX32 u32B2=%RX32\n", u32B1, u32B2));
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync }
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync else
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync {
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync szState[0] = '\0';
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync rc = RTRandAdvRestoreState(hRand, szState);
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync CHECK_EXPR_MSG(rc == VERR_NOT_SUPPORTED, ("RTRandAdvRestoreState(%p,\"\") -> %Rrc (%d)\n", (uintptr_t)hRand, rc, rc));
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync }
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync /*
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * Destroy it.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync */
062b8a43e237d9e2edde03b5837d44506e35eb47vboxsync rc = RTRandAdvDestroy(hRand);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync CHECK_EXPR_MSG(rc == VINF_SUCCESS, ("RTRandAdvDestroy(%p) -> %Rrc (%d)\n", (uintptr_t)hRand, rc, rc));
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync return 0;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync}
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsyncint main()
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync{
230bd8589bba39933ac5ec21482d6186d675e604vboxsync RTR3InitExeNoArguments(0);
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync RTPrintf("tstRand: TESTING...\n");
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync /*
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync * Do some smoke tests first?
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync */
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync /** @todo RTRand smoke testing. */
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync#if 1
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync /*
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync * Test distribution.
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync */
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync#if 1
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync /* unsigned 32-bit */
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync static const struct
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync {
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint32_t u32First;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint32_t u32Last;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync } s_aU32Tests[] =
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync {
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 0, UINT32_MAX },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 0, UINT32_MAX / 2 + UINT32_MAX / 4 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 0, UINT32_MAX / 2 + UINT32_MAX / 8 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 0, UINT32_MAX / 2 + UINT32_MAX / 16 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 0, UINT32_MAX / 2 + UINT32_MAX / 64 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 0, UINT32_MAX / 2 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { UINT32_MAX / 4, UINT32_MAX / 4 * 3 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 0, TST_RAND_SAMPLE_RANGES - 1 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 1234, 1234 + TST_RAND_SAMPLE_RANGES - 1 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync };
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync for (unsigned iTest = 0; iTest < RT_ELEMENTS(s_aU32Tests); iTest++)
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync {
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint32_t acHits[TST_RAND_SAMPLE_RANGES] = {0};
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint32_t const uFirst = s_aU32Tests[iTest].u32First;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint32_t const uLast = s_aU32Tests[iTest].u32Last;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint32_t const uRange = uLast - uFirst; Assert(uLast >= uFirst);
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint32_t const uDivisor = uRange / TST_RAND_SAMPLE_RANGES + 1;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync RTPrintf("tstRand: TESTING RTRandU32Ex(%#RX32, %#RX32) distribution... [div=%#RX32 range=%#RX32]\n", uFirst, uLast, uDivisor, uRange);
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync for (unsigned iSample = 0; iSample < TST_RAND_SAMPLE_RANGES * 10240; iSample++)
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync {
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint32_t uRand = RTRandU32Ex(uFirst, uLast);
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync CHECK_EXPR_MSG(uRand >= uFirst, ("%#RX32 %#RX32\n", uRand, uFirst));
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync CHECK_EXPR_MSG(uRand <= uLast, ("%#RX32 %#RX32\n", uRand, uLast));
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint32_t off = uRand - uFirst;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync acHits[off / uDivisor]++;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync }
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync tstRandCheckDist(acHits, iTest);
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync }
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync#endif
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync#if 1
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync /* unsigned 64-bit */
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync static const struct
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync {
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint64_t u64First;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint64_t u64Last;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync } s_aU64Tests[] =
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync {
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 0, UINT64_MAX },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 0, UINT64_MAX / 2 + UINT64_MAX / 4 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 0, UINT64_MAX / 2 + UINT64_MAX / 8 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 0, UINT64_MAX / 2 + UINT64_MAX / 16 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 0, UINT64_MAX / 2 + UINT64_MAX / 64 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 0, UINT64_MAX / 2 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { UINT64_MAX / 4, UINT64_MAX / 4 * 3 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 0, UINT32_MAX },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 0, UINT32_MAX / 2 + UINT32_MAX / 4 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 0, UINT32_MAX / 2 + UINT32_MAX / 8 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 0, UINT32_MAX / 2 + UINT32_MAX / 16 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 0, UINT32_MAX / 2 + UINT32_MAX / 64 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 0, UINT32_MAX / 2 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { UINT32_MAX / 4, UINT32_MAX / 4 * 3 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 0, TST_RAND_SAMPLE_RANGES - 1 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 1234, 1234 + TST_RAND_SAMPLE_RANGES - 1 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync };
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync for (unsigned iTest = 0; iTest < RT_ELEMENTS(s_aU64Tests); iTest++)
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync {
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint32_t acHits[TST_RAND_SAMPLE_RANGES] = {0};
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint64_t const uFirst = s_aU64Tests[iTest].u64First;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint64_t const uLast = s_aU64Tests[iTest].u64Last;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint64_t const uRange = uLast - uFirst; Assert(uLast >= uFirst);
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint64_t const uDivisor = uRange / TST_RAND_SAMPLE_RANGES + 1;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync RTPrintf("tstRand: TESTING RTRandU64Ex(%#RX64, %#RX64) distribution... [div=%#RX64 range=%#RX64]\n", uFirst, uLast, uDivisor, uRange);
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync for (unsigned iSample = 0; iSample < TST_RAND_SAMPLE_RANGES * 10240; iSample++)
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync {
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint64_t uRand = RTRandU64Ex(uFirst, uLast);
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync CHECK_EXPR_MSG(uRand >= uFirst, ("%#RX64 %#RX64\n", uRand, uFirst));
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync CHECK_EXPR_MSG(uRand <= uLast, ("%#RX64 %#RX64\n", uRand, uLast));
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint64_t off = uRand - uFirst;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync acHits[off / uDivisor]++;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync }
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync tstRandCheckDist(acHits, iTest);
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync }
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync#endif
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync#if 1
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync /* signed 32-bit */
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync static const struct
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync {
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync int32_t i32First;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync int32_t i32Last;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync } s_aS32Tests[] =
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync {
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { -429496729, 429496729 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT32_MIN, INT32_MAX },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT32_MIN, INT32_MAX / 2 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { -0x20000000, INT32_MAX },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { -0x10000000, INT32_MAX },
a3adbaeff161b554f16f262f728c89e2cf0afcaevboxsync { -0x08000000, INT32_MAX },
a3adbaeff161b554f16f262f728c89e2cf0afcaevboxsync { -0x00800000, INT32_MAX },
a3adbaeff161b554f16f262f728c89e2cf0afcaevboxsync { -0x00080000, INT32_MAX },
a3adbaeff161b554f16f262f728c89e2cf0afcaevboxsync { -0x00008000, INT32_MAX },
a3adbaeff161b554f16f262f728c89e2cf0afcaevboxsync { -0x00000800, INT32_MAX },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 2, INT32_MAX / 2 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 4000000, INT32_MAX / 2 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { -4000000, INT32_MAX / 2 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT32_MIN / 2, INT32_MAX / 2 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT32_MIN / 3, INT32_MAX / 2 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT32_MIN / 3, INT32_MAX / 3 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT32_MIN / 3, INT32_MAX / 4 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT32_MIN / 4, INT32_MAX / 4 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT32_MIN / 5, INT32_MAX / 5 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT32_MIN / 6, INT32_MAX / 6 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT32_MIN / 7, INT32_MAX / 6 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT32_MIN / 7, INT32_MAX / 7 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT32_MIN / 7, INT32_MAX / 8 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT32_MIN / 8, INT32_MAX / 8 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT32_MIN / 9, INT32_MAX / 9 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT32_MIN / 9, INT32_MAX / 12 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT32_MIN / 12, INT32_MAX / 12 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 0, TST_RAND_SAMPLE_RANGES - 1 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { -TST_RAND_SAMPLE_RANGES / 2, TST_RAND_SAMPLE_RANGES / 2 - 1 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync };
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync for (unsigned iTest = 0; iTest < RT_ELEMENTS(s_aS32Tests); iTest++)
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync {
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint32_t acHits[TST_RAND_SAMPLE_RANGES] = {0};
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync int32_t const iFirst = s_aS32Tests[iTest].i32First;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync int32_t const iLast = s_aS32Tests[iTest].i32Last;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint32_t const uRange = iLast - iFirst; AssertMsg(iLast >= iFirst, ("%d\n", iTest));
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint32_t const uDivisor = (uRange ? uRange : UINT32_MAX) / TST_RAND_SAMPLE_RANGES + 1;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync RTPrintf("tstRand: TESTING RTRandS32Ex(%#RI32, %#RI32) distribution... [div=%#RX32 range=%#RX32]\n", iFirst, iLast, uDivisor, uRange);
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync for (unsigned iSample = 0; iSample < TST_RAND_SAMPLE_RANGES * 10240; iSample++)
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync {
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync int32_t iRand = RTRandS32Ex(iFirst, iLast);
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync CHECK_EXPR_MSG(iRand >= iFirst, ("%#RI32 %#RI32\n", iRand, iFirst));
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync CHECK_EXPR_MSG(iRand <= iLast, ("%#RI32 %#RI32\n", iRand, iLast));
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint32_t off = iRand - iFirst;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync acHits[off / uDivisor]++;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync }
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync tstRandCheckDist(acHits, iTest);
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync }
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync#endif
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync#if 1
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync /* signed 64-bit */
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync static const struct
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync {
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync int64_t i64First;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync int64_t i64Last;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync } s_aS64Tests[] =
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync {
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN, INT64_MAX },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN, INT64_MAX / 2 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN / 2, INT64_MAX / 2 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN / 2 + INT64_MIN / 4, INT64_MAX / 2 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN / 2 + INT64_MIN / 8, INT64_MAX / 2 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN / 2 + INT64_MIN / 16, INT64_MAX / 2 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN / 2 + INT64_MIN / 64, INT64_MAX / 2 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN / 2 + INT64_MIN / 64, INT64_MAX / 2 + INT64_MAX / 64 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN / 2, INT64_MAX / 2 + INT64_MAX / 64 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN / 2, INT64_MAX / 2 + INT64_MAX / 8 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN / 2, INT64_MAX / 2 - INT64_MAX / 8 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN / 2 - INT64_MIN / 4, INT64_MAX / 2 - INT64_MAX / 4 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN / 2 - INT64_MIN / 4, INT64_MAX / 2 - INT64_MAX / 8 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN / 2 - INT64_MIN / 8, INT64_MAX / 2 - INT64_MAX / 8 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN / 2 - INT64_MIN / 16, INT64_MAX / 2 - INT64_MAX / 8 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN / 2 - INT64_MIN / 16, INT64_MAX / 2 - INT64_MAX / 16 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN / 2 - INT64_MIN / 32, INT64_MAX / 2 - INT64_MAX / 16 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN / 2 - INT64_MIN / 32, INT64_MAX / 2 - INT64_MAX / 32 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN / 2 - INT64_MIN / 64, INT64_MAX / 2 - INT64_MAX / 64 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN / 2 - INT64_MIN / 8, INT64_MAX / 2 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN / 4, INT64_MAX / 4 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN / 5, INT64_MAX / 5 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN / 6, INT64_MAX / 6 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN / 7, INT64_MAX / 7 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT64_MIN / 8, INT64_MAX / 8 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT32_MIN, INT32_MAX },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT32_MIN, INT32_MAX / 2 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { -0x20000000, INT32_MAX },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { -0x10000000, INT32_MAX },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { -0x7f000000, INT32_MAX },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { -0x08000000, INT32_MAX },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { -0x00800000, INT32_MAX },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { -0x00080000, INT32_MAX },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { -0x00008000, INT32_MAX },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 2, INT32_MAX / 2 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 4000000, INT32_MAX / 2 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { -4000000, INT32_MAX / 2 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { INT32_MIN / 2, INT32_MAX / 2 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { 0, TST_RAND_SAMPLE_RANGES - 1 },
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync { -TST_RAND_SAMPLE_RANGES / 2, TST_RAND_SAMPLE_RANGES / 2 - 1 }
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync };
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync for (unsigned iTest = 0; iTest < RT_ELEMENTS(s_aS64Tests); iTest++)
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync {
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint32_t acHits[TST_RAND_SAMPLE_RANGES] = {0};
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync int64_t const iFirst = s_aS64Tests[iTest].i64First;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync int64_t const iLast = s_aS64Tests[iTest].i64Last;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint64_t const uRange = iLast - iFirst; AssertMsg(iLast >= iFirst, ("%d\n", iTest));
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint64_t const uDivisor = (uRange ? uRange : UINT64_MAX) / TST_RAND_SAMPLE_RANGES + 1;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync RTPrintf("tstRand: TESTING RTRandS64Ex(%#RI64, %#RI64) distribution... [div=%#RX64 range=%#016RX64]\n", iFirst, iLast, uDivisor, uRange);
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync for (unsigned iSample = 0; iSample < TST_RAND_SAMPLE_RANGES * 10240; iSample++)
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync {
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync int64_t iRand = RTRandS64Ex(iFirst, iLast);
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync CHECK_EXPR_MSG(iRand >= iFirst, ("%#RI64 %#RI64\n", iRand, iFirst));
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync CHECK_EXPR_MSG(iRand <= iLast, ("%#RI64 %#RI64\n", iRand, iLast));
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync uint64_t off = iRand - iFirst;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync acHits[off / uDivisor]++;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync }
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync tstRandCheckDist(acHits, iTest);
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync }
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync#endif
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync#endif /* Testing RTRand */
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync#if 1
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync /*
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync * Test the various random generators.
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync */
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync RTPrintf("tstRand: TESTING RTRandAdvCreateParkerMiller\n");
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync RTRAND hRand;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync int rc = RTRandAdvCreateParkMiller(&hRand);
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync CHECK_EXPR_MSG(rc == VINF_SUCCESS, ("rc=%Rrc\n", rc));
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync if (RT_SUCCESS(rc))
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync if (tstRandAdv(hRand))
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync return 1;
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync
6fea4abcc6ee0f2797ac01ef79c374d506aedc02vboxsync#endif /* Testing RTRandAdv */
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync /*
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync * Summary.
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync */
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync if (!g_cErrors)
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync RTPrintf("tstRand: SUCCESS\n");
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync else
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync RTPrintf("tstRand: FAILED - %d errors\n", g_cErrors);
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync return !!g_cErrors;
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync}
804eb59e2e0ce9f35874edada7e5c643647193d4vboxsync