OpenShot Library | OpenShotAudio 0.2.2
juce_Random.cpp
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2017 - ROLI Ltd.
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 The code included in this file is provided under the terms of the ISC license
11 http://www.isc.org/downloads/software-support-policy/isc-license. Permission
12 To use, copy, modify, and/or distribute this software for any purpose with or
13 without fee is hereby granted provided that the above copyright notice and
14 this permission notice appear in all copies.
15
16 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
17 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
18 DISCLAIMED.
19
20 ==============================================================================
21*/
22
23namespace juce
24{
25
26Random::Random (int64 seedValue) noexcept : seed (seedValue)
27{
28}
29
30Random::Random() : seed (1)
31{
33}
34
36{
37}
38
39void Random::setSeed (const int64 newSeed) noexcept
40{
41 if (this == &getSystemRandom())
42 {
43 // Resetting the system Random risks messing up
44 // JUCE's internal state. If you need a predictable
45 // stream of random numbers you should use a local
46 // Random object.
47 jassertfalse;
48 return;
49 }
50
51 seed = newSeed;
52}
53
54void Random::combineSeed (const int64 seedValue) noexcept
55{
56 seed ^= nextInt64() ^ seedValue;
57}
58
60{
61 static std::atomic<int64> globalSeed { 0 };
62
63 combineSeed (globalSeed ^ (int64) (pointer_sized_int) this);
68 globalSeed ^= seed;
69}
70
72{
73 static Random sysRand;
74 return sysRand;
75}
76
77//==============================================================================
78int Random::nextInt() noexcept
79{
80 seed = (int64) (((((uint64) seed) * 0x5deece66dLL) + 11) & 0xffffffffffffLL);
81
82 return (int) (seed >> 16);
83}
84
85int Random::nextInt (const int maxValue) noexcept
86{
87 jassert (maxValue > 0);
88 return (int) ((((unsigned int) nextInt()) * (uint64) maxValue) >> 32);
89}
90
91int Random::nextInt (Range<int> range) noexcept
92{
93 return range.getStart() + nextInt (range.getLength());
94}
95
96int64 Random::nextInt64() noexcept
97{
98 return (int64) ((((uint64) (unsigned int) nextInt()) << 32) | (uint64) (unsigned int) nextInt());
99}
100
101bool Random::nextBool() noexcept
102{
103 return (nextInt() & 0x40000000) != 0;
104}
105
106float Random::nextFloat() noexcept
107{
108 return static_cast<uint32> (nextInt()) / (std::numeric_limits<uint32>::max() + 1.0f);
109}
110
111double Random::nextDouble() noexcept
112{
113 return static_cast<uint32> (nextInt()) / (std::numeric_limits<uint32>::max() + 1.0);
114}
115
117{
118 BigInteger n;
119
120 do
121 {
122 fillBitsRandomly (n, 0, maximumValue.getHighestBit() + 1);
123 }
124 while (n >= maximumValue);
125
126 return n;
127}
128
129void Random::fillBitsRandomly (void* const buffer, size_t bytes)
130{
131 int* d = static_cast<int*> (buffer);
132
133 for (; bytes >= sizeof (int); bytes -= sizeof (int))
134 *d++ = nextInt();
135
136 if (bytes > 0)
137 {
138 const int lastBytes = nextInt();
139 memcpy (d, &lastBytes, bytes);
140 }
141}
142
143void Random::fillBitsRandomly (BigInteger& arrayToChange, int startBit, int numBits)
144{
145 arrayToChange.setBit (startBit + numBits - 1, true); // to force the array to pre-allocate space
146
147 while ((startBit & 31) != 0 && numBits > 0)
148 {
149 arrayToChange.setBit (startBit++, nextBool());
150 --numBits;
151 }
152
153 while (numBits >= 32)
154 {
155 arrayToChange.setBitRangeAsInt (startBit, 32, (unsigned int) nextInt());
156 startBit += 32;
157 numBits -= 32;
158 }
159
160 while (--numBits >= 0)
161 arrayToChange.setBit (startBit + numBits, nextBool());
162}
163
164
165//==============================================================================
166//==============================================================================
167#if JUCE_UNIT_TESTS
168
169class RandomTests : public UnitTest
170{
171public:
172 RandomTests()
173 : UnitTest ("Random", UnitTestCategories::maths)
174 {}
175
176 void runTest() override
177 {
178 beginTest ("Random");
179
180 Random r = getRandom();
181
182 for (int i = 2000; --i >= 0;)
183 {
184 expect (r.nextDouble() >= 0.0 && r.nextDouble() < 1.0);
185 expect (r.nextFloat() >= 0.0f && r.nextFloat() < 1.0f);
186 expect (r.nextInt (5) >= 0 && r.nextInt (5) < 5);
187 expect (r.nextInt (1) == 0);
188
189 int n = r.nextInt (50) + 1;
190 expect (r.nextInt (n) >= 0 && r.nextInt (n) < n);
191
192 n = r.nextInt (0x7ffffffe) + 1;
193 expect (r.nextInt (n) >= 0 && r.nextInt (n) < n);
194 }
195 }
196};
197
198static RandomTests randomTests;
199
200#endif
201
202} // namespace juce
An arbitrarily large integer class.
int getHighestBit() const noexcept
Returns the index of the highest set bit in the number.
void setBit(int bitNumber)
Sets a specified bit to 1.
void setBitRangeAsInt(int startBit, int numBits, uint32 valueToSet)
Sets a range of bits to an integer value.
A random number generator.
Definition: juce_Random.h:39
float nextFloat() noexcept
Returns the next random floating-point number.
Random()
Creates a Random object using a random seed value.
Definition: juce_Random.cpp:30
void fillBitsRandomly(void *bufferToFill, size_t sizeInBytes)
Fills a block of memory with random values.
bool nextBool() noexcept
Returns the next random boolean value.
void setSeedRandomly()
Reseeds this generator using a value generated from various semi-random system properties like the cu...
Definition: juce_Random.cpp:59
void combineSeed(int64 seedValue) noexcept
Merges this object's seed with another value.
Definition: juce_Random.cpp:54
int nextInt() noexcept
Returns the next random 32 bit integer.
Definition: juce_Random.cpp:78
~Random() noexcept
Destructor.
Definition: juce_Random.cpp:35
int64 nextInt64() noexcept
Returns the next 64-bit random number.
Definition: juce_Random.cpp:96
void setSeed(int64 newSeed) noexcept
Resets this Random object to a given seed value.
Definition: juce_Random.cpp:39
double nextDouble() noexcept
Returns the next random floating-point number.
BigInteger nextLargeNumber(const BigInteger &maximumValue)
Returns a BigInteger containing a random number.
static Random & getSystemRandom() noexcept
The overhead of creating a new Random object is fairly small, but if you want to avoid it,...
Definition: juce_Random.cpp:71
static int64 getHighResolutionTicks() noexcept
Returns the current high-resolution counter's tick-count.
static int64 currentTimeMillis() noexcept
Returns the current system time.
Definition: juce_Time.cpp:205
static int64 getHighResolutionTicksPerSecond() noexcept
Returns the resolution of the high-resolution counter in ticks per second.
static uint32 getMillisecondCounter() noexcept
Returns the number of millisecs since a fixed event (usually system startup).
Definition: juce_Time.cpp:226
This is a base class for classes that perform a unit test.
Definition: juce_UnitTest.h:74