Coverage Report

Created: 2026-03-01 07:11

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/poco/Foundation/include/Poco/Random.h
Line
Count
Source
1
//
2
// Random.h
3
//
4
// Library: Foundation
5
// Package: Crypt
6
// Module:  Random
7
//
8
// Definition of class Random.
9
//
10
// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
11
// and Contributors.
12
//
13
// SPDX-License-Identifier: BSL-1.0
14
//
15
//
16
// Based on the FreeBSD random number generator.
17
// src/lib/libc/stdlib/random.c,v 1.25
18
//
19
// Copyright (c) 1983, 1993
20
// The Regents of the University of California.  All rights reserved.
21
// Redistribution and use in source and binary forms, with or without
22
// modification, are permitted provided that the following conditions
23
// are met:
24
// 1. Redistributions of source code must retain the above copyright
25
//    notice, this list of conditions and the following disclaimer.
26
// 2. Redistributions in binary form must reproduce the above copyright
27
//    notice, this list of conditions and the following disclaimer in the
28
//    documentation and/or other materials provided with the distribution.
29
// 4. Neither the name of the University nor the names of its contributors
30
//    may be used to endorse or promote products derived from this software
31
//    without specific prior written permission.
32
//
33
// THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
34
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
35
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
36
// ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
37
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
38
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
39
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
40
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
41
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
42
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
43
// SUCH DAMAGE.
44
//
45
46
47
#ifndef Foundation_Random_INCLUDED
48
#define Foundation_Random_INCLUDED
49
50
51
#include "Poco/Foundation.h"
52
53
54
namespace Poco {
55
56
57
class Foundation_API Random
58
  /// A better random number generator.
59
  /// Random implements a pseudo random number generator
60
  /// (PRNG). The PRNG is a nonlinear additive
61
  /// feedback random number generator using 256 bytes
62
  /// of state information and a period of up to 2^69.
63
{
64
public:
65
  enum Type
66
  {
67
    RND_STATE_0   =   8,  /// linear congruential
68
    RND_STATE_32  =  32,  /// x**7 + x**3 + 1
69
    RND_STATE_64  =  64,  /// x**15 + x + 1
70
    RND_STATE_128 = 128,  /// x**31 + x**3 + 1
71
    RND_STATE_256 = 256   /// x**63 + x + 1
72
  };
73
74
  Random(int stateSize = 256);
75
    /// Creates and initializes the PRNG.
76
    /// Specify either a state buffer size
77
    /// (8 to 256 bytes) or one of the Type values.
78
79
  ~Random();
80
    /// Destroys the PRNG.
81
82
  void seed(UInt32 seed);
83
    /// Seeds the pseudo random generator with the given seed.
84
85
  void seed();
86
    /// Seeds the pseudo random generator with a random seed
87
    /// obtained from a RandomInputStream.
88
89
  UInt32 next();
90
    /// Returns the next 31-bit pseudo random number.
91
92
  UInt32 next(UInt32 n);
93
    /// Returns the next 31-bit pseudo random number modulo n.
94
95
  char nextChar();
96
    /// Returns the next pseudo random character.
97
98
  bool nextBool();
99
    /// Returns the next boolean pseudo random value.
100
101
  float nextFloat();
102
    /// Returns the next float pseudo random number between 0.0 and 1.0.
103
104
  double nextDouble();
105
    /// Returns the next double pseudo random number between 0.0 and 1.0.
106
107
protected:
108
  void initState(UInt32 seed, char* arg_state, Int32 n);
109
  static UInt32 goodRand(Int32 x);
110
111
private:
112
  enum
113
  {
114
    MAX_TYPES = 5,
115
    NSHUFF    = 50
116
  };
117
118
  UInt32* _fptr;
119
  UInt32* _rptr;
120
  UInt32* _state;
121
  int     _randType;
122
  int     _randDeg;
123
  int     _randSep;
124
  UInt32* _endPtr;
125
  char*  _pBuffer;
126
};
127
128
129
//
130
// inlines
131
//
132
inline UInt32 Random::next(UInt32 n)
133
0
{
134
0
  return next() % n;
135
0
}
136
137
138
inline char Random::nextChar()
139
0
{
140
0
  return char((next() >> 3) & 0xFF);
141
0
}
142
143
144
inline bool Random::nextBool()
145
0
{
146
0
  return (next() & 0x1000) != 0;
147
0
}
148
149
150
inline float Random::nextFloat()
151
0
{
152
0
  return static_cast<float>(nextDouble());
153
0
}
154
155
156
inline double Random::nextDouble()
157
0
{
158
0
  return static_cast<double>(next()) / static_cast<double>(0x7FFFFFFF);
159
0
}
160
161
162
} // namespace Poco
163
164
165
#endif // Foundation_Random_INCLUDED