JUCE-7.0.12-0-g4f43011b96 JUCE-7.0.12-0-g4f43011b96
JUCE — C++ application framework with suport for VST, VST3, LV2 audio plug-ins

« « « Anklang Documentation
Loading...
Searching...
No Matches
juce_Random.cpp
Go to the documentation of this file.
1 /*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
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
35void Random::setSeed (const int64 newSeed) noexcept
36{
37 if (this == &getSystemRandom())
38 {
39 // Resetting the system Random risks messing up
40 // JUCE's internal state. If you need a predictable
41 // stream of random numbers you should use a local
42 // Random object.
44 return;
45 }
46
47 seed = newSeed;
48}
49
50void Random::combineSeed (const int64 seedValue) noexcept
51{
52 seed ^= nextInt64() ^ seedValue;
53}
54
66
68{
69 static Random sysRand;
70 return sysRand;
71}
72
73//==============================================================================
74int Random::nextInt() noexcept
75{
76 seed = (int64) (((((uint64) seed) * 0x5deece66dLL) + 11) & 0xffffffffffffLL);
77
78 return (int) (seed >> 16);
79}
80
81int Random::nextInt (const int maxValue) noexcept
82{
83 jassert (maxValue > 0);
84 return (int) ((((unsigned int) nextInt()) * (uint64) maxValue) >> 32);
85}
86
87int Random::nextInt (Range<int> range) noexcept
88{
89 return range.getStart() + nextInt (range.getLength());
90}
91
93{
94 return (int64) ((((uint64) (unsigned int) nextInt()) << 32) | (uint64) (unsigned int) nextInt());
95}
96
97bool Random::nextBool() noexcept
98{
99 return (nextInt() & 0x40000000) != 0;
100}
101
102float Random::nextFloat() noexcept
103{
104 auto result = static_cast<float> (static_cast<uint32> (nextInt()))
105 / (static_cast<float> (std::numeric_limits<uint32>::max()) + 1.0f);
106 return jmin (result, 1.0f - std::numeric_limits<float>::epsilon());
107}
108
109double Random::nextDouble() noexcept
110{
111 return static_cast<uint32> (nextInt()) / (std::numeric_limits<uint32>::max() + 1.0);
112}
113
115{
116 BigInteger n;
117
118 do
119 {
121 }
122 while (n >= maximumValue);
123
124 return n;
125}
126
127void Random::fillBitsRandomly (void* const buffer, size_t bytes)
128{
129 int* d = static_cast<int*> (buffer);
130
131 for (; bytes >= sizeof (int); bytes -= sizeof (int))
132 *d++ = nextInt();
133
134 if (bytes > 0)
135 {
136 const int lastBytes = nextInt();
137 memcpy (d, &lastBytes, bytes);
138 }
139}
140
142{
143 arrayToChange.setBit (startBit + numBits - 1, true); // to force the array to pre-allocate space
144
145 while ((startBit & 31) != 0 && numBits > 0)
146 {
147 arrayToChange.setBit (startBit++, nextBool());
148 --numBits;
149 }
150
151 while (numBits >= 32)
152 {
153 arrayToChange.setBitRangeAsInt (startBit, 32, (unsigned int) nextInt());
154 startBit += 32;
155 numBits -= 32;
156 }
157
158 while (--numBits >= 0)
160}
161
162
163//==============================================================================
164//==============================================================================
165#if JUCE_UNIT_TESTS
166
167class RandomTests final : public UnitTest
168{
169public:
171 : UnitTest ("Random", UnitTestCategories::maths)
172 {}
173
174 void runTest() override
175 {
176 beginTest ("Random");
177
178 Random r = getRandom();
179
180 for (int i = 2000; --i >= 0;)
181 {
182 expect (r.nextDouble() >= 0.0 && r.nextDouble() < 1.0);
183 expect (r.nextFloat() >= 0.0f && r.nextFloat() < 1.0f);
184 expect (r.nextInt (5) >= 0 && r.nextInt (5) < 5);
185 expect (r.nextInt (1) == 0);
186
187 int n = r.nextInt (50) + 1;
188 expect (r.nextInt (n) >= 0 && r.nextInt (n) < n);
189
190 n = r.nextInt (0x7ffffffe) + 1;
191 expect (r.nextInt (n) >= 0 && r.nextInt (n) < n);
192 }
193 }
194};
195
197
198#endif
199
200} // namespace juce
An arbitrarily large integer class.
int getHighestBit() const noexcept
Returns the index of the highest set bit in the number.
A random number generator.
Definition juce_Random.h:35
float nextFloat() noexcept
Returns the next random floating-point number.
Random()
Creates a Random object using a random seed value.
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...
void combineSeed(int64 seedValue) noexcept
Merges this object's seed with another value.
int nextInt() noexcept
Returns the next random 32 bit integer.
int64 nextInt64() noexcept
Returns the next 64-bit random number.
void setSeed(int64 newSeed) noexcept
Resets this Random object to a given seed value.
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,...
A general-purpose range object, that simply represents any linear range with a start and end point.
Definition juce_Range.h:40
static int64 currentTimeMillis() noexcept
Returns the current system time.
static int64 getHighResolutionTicksPerSecond() noexcept
Returns the resolution of the high-resolution counter in ticks per second.
static int64 getHighResolutionTicks() noexcept
Returns the current high-resolution counter's tick-count.
static uint32 getMillisecondCounter() noexcept
Returns the number of millisecs since a fixed event (usually system startup).
This is a base class for classes that perform a unit test.
#define jassert(expression)
Platform-independent assertion macro.
#define jassertfalse
This will always cause an assertion failure.
typedef int
T max(T... args)
memcpy
JUCE Namespace.
int pointer_sized_int
A signed integer type that's guaranteed to be large enough to hold a pointer without truncating it.
constexpr Type jmin(Type a, Type b)
Returns the smaller of two values.
unsigned long long uint64
A platform-independent 64-bit unsigned integer type.
Type unalignedPointerCast(void *ptr) noexcept
Casts a pointer to another type via void*, which suppresses the cast-align warning which sometimes ar...
Definition juce_Memory.h:88
unsigned int uint32
A platform-independent 32-bit unsigned integer type.
long long int64
A platform-independent 64-bit integer type.