13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Base Portability Library
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * -------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Random number generation.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deRandom.h"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <float.h>
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <math.h>
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
293c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDE_BEGIN_EXTERN_C
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Initialize a random number generator with a given seed.
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param rnd	RNG to initialize.
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param seed	Seed value used for random values.
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid deRandom_init (deRandom* rnd, deUint32 seed)
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	rnd->x = (deUint32)(-(int)seed ^ 123456789);
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	rnd->y = (deUint32)(362436069 * seed);
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	rnd->z = (deUint32)(521288629 ^ (seed >> 7));
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	rnd->w = (deUint32)(88675123 ^ (seed << 3));
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Get a pseudo random uint32.
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param rnd	Pointer to RNG.
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \return Random uint32 number.
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
493c827367444ee418f129b2c238299f49d3264554Jarkko PoyrydeUint32 deRandom_getUint32 (deRandom* rnd)
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 w = rnd->w;
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 t;
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	t = rnd->x ^ (rnd->x << 11);
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	rnd->x = rnd->y;
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	rnd->y = rnd->z;
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	rnd->z = w;
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	rnd->w = w = (w ^ (w >> 19)) ^ (t ^ (t >> 8));
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return w;
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Get a pseudo random uint64.
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param rnd	Pointer to RNG.
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \return Random uint64 number.
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
673c827367444ee418f129b2c238299f49d3264554Jarkko PoyrydeUint64 deRandom_getUint64 (deRandom* rnd)
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint64 x = deRandom_getUint32(rnd);
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return x << 32 | deRandom_getUint32(rnd);
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Get a pseudo random float in range [0, 1[.
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param rnd	Pointer to RNG.
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \return Random float number.
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyryfloat deRandom_getFloat (deRandom* rnd)
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return (float)(deRandom_getUint32(rnd) & 0xFFFFFFFu) / (float)(0xFFFFFFFu+1);
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Get a pseudo random float in range [0, 1[.
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param rnd	Pointer to RNG.
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \return Random float number.
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydouble deRandom_getDouble (deRandom* rnd)
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_STATIC_ASSERT(FLT_RADIX == 2);
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return ldexp((double)(deRandom_getUint64(rnd) & ((1ull << DBL_MANT_DIG) - 1)),
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				 -DBL_MANT_DIG);
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Get a pseudo random boolean value (DE_FALSE or DE_TRUE).
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param rnd	Pointer to RNG.
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \return Random float number.
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
1003c827367444ee418f129b2c238299f49d3264554Jarkko PoyrydeBool deRandom_getBool (deRandom* rnd)
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 val = deRandom_getUint32(rnd);
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return ((val & 0xFFFFFF) < 0x800000);
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1063c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDE_END_EXTERN_C
107