Package org.apache.commons.lang3
Class CachedRandomBits
java.lang.Object
org.apache.commons.lang3.CachedRandomBits
Generates random integers of specific bit length.
It is more efficient than calling Random.nextInt(1 invalid input: '<'invalid input: '<' nbBits). It uses a cache of cacheSize random bytes that it replenishes when it gets empty. This is especially beneficial for SecureRandom Drbg implementations, which incur a constant cost at each randomness generation.
Used internally by RandomStringUtils.
#NotThreadSafe#
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final intMask to extract the bit offset within a byte (0-7)private intIndex of the next bit in the cache to be used.private static final intNumber of bits in a byteprivate final byte[]private static final intMaximum number of bits that can be generated (size of an int)private static final intThe maximum size of the cache.private final Random -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionintnextBits(int bits) Generates a random integer with the specified number of bits.
-
Field Details
-
MAX_CACHE_SIZE
private static final int MAX_CACHE_SIZEThe maximum size of the cache.This is to prevent the possibility of overflow in the
if (bitIndex >> 3 >= cache.length)in thenextBits(int)method.- See Also:
-
MAX_BITS
private static final int MAX_BITSMaximum number of bits that can be generated (size of an int)- See Also:
-
BIT_INDEX_MASK
private static final int BIT_INDEX_MASKMask to extract the bit offset within a byte (0-7)- See Also:
-
BITS_PER_BYTE
private static final int BITS_PER_BYTENumber of bits in a byte- See Also:
-
random
-
cache
private final byte[] cache -
bitIndex
private int bitIndexIndex of the next bit in the cache to be used.- bitIndex=0 means the cache is fully random and none of the bits have been used yet.
- bitIndex=1 means that only the LSB of cache[0] has been used and all other bits can be used.
- bitIndex=8 means that only the 8 bits of cache[0] has been used.
-
-
Constructor Details
-
CachedRandomBits
CachedRandomBits(int cacheSize, Random random) Creates a new instance.- Parameters:
cacheSize- number of bytes cached (only affects performance)random- random source
-
-
Method Details
-
nextBits
public int nextBits(int bits) Generates a random integer with the specified number of bits.This method efficiently generates random bits by using a byte cache and bit manipulation:
- Uses a byte array cache to avoid frequent calls to the underlying random number generator
- Extracts bits from each byte using bit shifting and masking
- Handles partial bytes to avoid wasting random bits
- Accumulates bits until the requested number is reached
- Parameters:
bits- number of bits to generate, MUST be between 1 and 32 (inclusive)- Returns:
- random integer containing exactly the requested number of random bits
- Throws:
IllegalArgumentException- if bits is not between 1 and 32
-