File: vtkMinimalStandardRandomSequence.h

package info (click to toggle)
paraview 5.11.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 497,236 kB
  • sloc: cpp: 3,171,290; ansic: 1,315,072; python: 134,290; xml: 103,324; sql: 65,887; sh: 5,286; javascript: 4,901; yacc: 4,383; java: 3,977; perl: 2,363; lex: 1,909; f90: 1,255; objc: 143; makefile: 119; tcl: 59; pascal: 50; fortran: 29
file content (139 lines) | stat: -rw-r--r-- 5,016 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*=========================================================================

  Program:   Visualization Toolkit
  Module:    vtkMinimalStandardRandomSequence.h

  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
  All rights reserved.
  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.

     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notice for more information.
=========================================================================*/
/**
 * @class   vtkMinimalStandardRandomSequence
 * @brief   Park and Miller Sequence of pseudo random numbers
 *
 * vtkMinimalStandardRandomSequence is a sequence of statistically independent
 * pseudo random numbers uniformly distributed between 0.0 and 1.0.
 *
 * The sequence is generated by a prime modulus multiplicative linear
 * congruential generator (PMMLCG) or "Lehmer generator" with multiplier 16807
 * and prime modulus 2^(31)-1. The authors calls it
 * "minimal standard random number generator"
 *
 * ref: "Random Number Generators: Good Ones are Hard to Find,"
 * by Stephen K. Park and Keith W. Miller in Communications of the ACM,
 * 31, 10 (Oct. 1988) pp. 1192-1201.
 * Code is at page 1195, "Integer version 2"
 *
 * Correctness test is described in first column, page 1195:
 * A seed of 1 at step 1 should give a seed of 1043618065 at step 10001.
 */

#ifndef vtkMinimalStandardRandomSequence_h
#define vtkMinimalStandardRandomSequence_h

#include "vtkCommonCoreModule.h" // For export macro
#include "vtkRandomSequence.h"

VTK_ABI_NAMESPACE_BEGIN
class VTKCOMMONCORE_EXPORT vtkMinimalStandardRandomSequence : public vtkRandomSequence
{
public:
  ///@{
  /**
   * Standard methods for instantiation, type information, and printing.
   */
  static vtkMinimalStandardRandomSequence* New();
  vtkTypeMacro(vtkMinimalStandardRandomSequence, vtkRandomSequence);
  void PrintSelf(ostream& os, vtkIndent indent) override;
  ///@}

  /**
   * Satisfy general API of vtkRandomSequence superclass. Initialize the
   * sequence with a seed.
   */
  void Initialize(vtkTypeUInt32 seed) override { this->SetSeed(seed); }

  /**
   * Set the seed of the random sequence.
   * The following pre-condition is stated page 1197, second column:
   * valid_seed: value>=1 && value<=2147483646
   * 2147483646=(2^31)-2
   * This method does not have this criterium as a pre-condition (ie it will
   * not fail if an incorrect seed value is passed) but the value is silently
   * changed to fit in the valid range [1,2147483646].
   * 2147483646 is added to a null or negative value.
   * 2147483647 is changed to be 1 (ie 2147483646 is subtracted).
   * Implementation note: it also performs 3 calls to Next() to avoid the
   * bad property that the first random number is proportional to the seed
   * value.
   */
  void SetSeed(int value);

  /**
   * Set the seed of the random sequence. There is no extra internal
   * adjustment. Only useful for writing correctness test.
   * The following pre-condition is stated page 1197, second column
   * 2147483646=(2^31)-2
   * This method does not have this criterium as a pre-condition (ie it will
   * not fail if an incorrect seed value is passed) but the value is silently
   * changed to fit in the valid range [1,2147483646].
   * 2147483646 is added to a null or negative value.
   * 2147483647 is changed to be 1 (ie 2147483646 is subtracted).
   */
  void SetSeedOnly(int value);

  /**
   * Get the seed of the random sequence.
   * Only useful for writing correctness test.
   */
  int GetSeed();

  /**
   * Current value
   * \post unit_range: result>=0.0 && result<=1.0
   */
  double GetValue() override;

  /**
   * Move to the next number in the random sequence.
   */
  void Next() override;

  /**
   * Convenient method to return a value in a specific range from the
   * range [0,1. There is an initial implementation that can be overridden
   * by a subclass.
   * There is no pre-condition on the range:
   * - it can be in increasing order: rangeMin<rangeMax
   * - it can be empty: rangeMin=rangeMax
   * - it can be in decreasing order: rangeMin>rangeMax
   * \post result_in_range:
   * (rangeMin<=rangeMax && result>=rangeMin && result<=rangeMax)
   * || (rangeMax<=rangeMin && result>=rangeMax && result<=rangeMin)
   */
  virtual double GetRangeValue(double rangeMin, double rangeMax);

  /**
   * Get the next value in the sequence within a range.
   *
   * \see vtkMinimalStandardRandomSequence::GetRangeValue
   */
  double GetNextRangeValue(double rangeMin, double rangeMax);

protected:
  vtkMinimalStandardRandomSequence();
  ~vtkMinimalStandardRandomSequence() override;

  int Seed;

private:
  vtkMinimalStandardRandomSequence(const vtkMinimalStandardRandomSequence&) = delete;
  void operator=(const vtkMinimalStandardRandomSequence&) = delete;
};

VTK_ABI_NAMESPACE_END
#endif // #ifndef vtkMinimalStandardRandomSequence_h