OpenShot Audio Library | OpenShotAudio 0.3.2
Loading...
Searching...
No Matches
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
27{
28}
29
30Random::Random() : seed (1)
31{
33}
34
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
70
76
77//==============================================================================
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
97{
98 return (int64) ((((uint64) (unsigned int) nextInt()) << 32) | (uint64) (unsigned int) nextInt());
99}
100
102{
103 return (nextInt() & 0x40000000) != 0;
104}
105
107{
108 return static_cast<uint32> (nextInt()) / (std::numeric_limits<uint32>::max() + 1.0f);
109}
110
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
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)
162}
163
164
165//==============================================================================
166//==============================================================================
167#if JUCE_UNIT_TESTS
168
169class RandomTests : public UnitTest
170{
171public:
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
Array()=default
float nextFloat() noexcept
void fillBitsRandomly(void *bufferToFill, size_t sizeInBytes)
bool nextBool() noexcept
void setSeedRandomly()
void combineSeed(int64 seedValue) noexcept
int nextInt() noexcept
~Random() noexcept
int64 nextInt64() noexcept
void setSeed(int64 newSeed) noexcept
double nextDouble() noexcept
BigInteger nextLargeNumber(const BigInteger &maximumValue)
static Random & getSystemRandom() noexcept
static int64 getHighResolutionTicks() noexcept
static int64 currentTimeMillis() noexcept
static int64 getHighResolutionTicksPerSecond() noexcept
static uint32 getMillisecondCounter() noexcept