1.3.64
 
Loading...
Searching...
No Matches
random.h
1
2/*
3 * Copyright (c) 2008 - 2009 NVIDIA Corporation. All rights reserved.
4 *
5 * NVIDIA Corporation and its licensors retain all intellectual property and proprietary
6 * rights in and to this software, related documentation and any modifications thereto.
7 * Any use, reproduction, disclosure or distribution of this software and related
8 * documentation without an express license agreement from NVIDIA Corporation is strictly
9 * prohibited.
10 *
11 * TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED *AS IS*
12 * AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS OR IMPLIED,
13 * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
14 * PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA OR ITS SUPPLIERS BE LIABLE FOR ANY
15 * SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT
16 * LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF
17 * BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR
18 * INABILITY TO USE THIS SOFTWARE, EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF
19 * SUCH DAMAGES
20 */
21
22// #include <optixu/optixu_math_namespace.h>
23
24template<unsigned int N>
25static __host__ __device__ __inline__ unsigned int tea(unsigned int val0, unsigned int val1) {
26 unsigned int v0 = val0;
27 unsigned int v1 = val1;
28 unsigned int s0 = 0;
29
30 for (unsigned int n = 0; n < N; n++) {
31 s0 += 0x9e3779b9;
32 v0 += ((v1 << 4) + 0xa341316c) ^ (v1 + s0) ^ ((v1 >> 5) + 0xc8013ea4);
33 v1 += ((v0 << 4) + 0xad90777d) ^ (v0 + s0) ^ ((v0 >> 5) + 0x7e95761e);
34 }
35
36 return v0;
37}
38
39// Generate random unsigned int in [0, 2^24)
40static __host__ __device__ __inline__ unsigned int lcg(unsigned int &prev) {
41 const unsigned int LCG_A = 1664525u;
42 const unsigned int LCG_C = 1013904223u;
43 prev = (LCG_A * prev + LCG_C);
44 return prev & 0x00FFFFFF;
45}
46
47// Generate random float in [0, 1)
48static __host__ __device__ __inline__ float rnd(unsigned int &prev) {
49 return ((float) lcg(prev) / (float) 0x01000000);
50}