00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include <RandomNumberGenerator.h>
00035 #include <CStdLibRandGenerator.h>
00036 #include <NormalRV.h>
00037 #include <Vector.h>
00038
00039
00040 CStdLibRandGenerator::CStdLibRandGenerator()
00041 :RandomNumberGenerator()
00042 {
00043 generatedNumbers = 0;
00044 }
00045
00046 CStdLibRandGenerator::~CStdLibRandGenerator()
00047 {
00048 if (generatedNumbers != 0)
00049 delete generatedNumbers;
00050 }
00051
00052
00053
00054
00055
00056 int
00057 CStdLibRandGenerator::generate_nIndependentUniformNumbers(int n, double lower, double upper, int seedIn)
00058 {
00059
00060 int j;
00061 int randomNumberBetween0AndRAND_MAX;
00062 double randomNumberBetween0And1;
00063 Vector randomArray(n);
00064
00065
00066
00067 if (seedIn != 0) {
00068 srand(seedIn);
00069 }
00070 for ( j=0; j<n; j++)
00071 {
00072
00073 randomNumberBetween0AndRAND_MAX = rand();
00074
00075
00076 randomNumberBetween0And1 = (double)randomNumberBetween0AndRAND_MAX/RAND_MAX;
00077
00078
00079 randomArray(j) = (upper-lower)*randomNumberBetween0And1 + lower;
00080 }
00081
00082 seed = randomNumberBetween0AndRAND_MAX;
00083
00084 if (generatedNumbers == 0) {
00085 generatedNumbers = new Vector(n);
00086 }
00087 else if (generatedNumbers->Size() != n) {
00088 delete generatedNumbers;
00089 generatedNumbers = new Vector(n);
00090 }
00091 (*generatedNumbers) = randomArray;
00092
00093
00094 return 0;
00095 }
00096
00097
00098
00099
00100 int
00101 CStdLibRandGenerator::generate_nIndependentStdNormalNumbers(int n, int seedIn)
00102 {
00103
00104 int j;
00105 int randomNumberBetween0AndRAND_MAX;
00106 double randomNumberBetween0And1;
00107 Vector randomArray(n);
00108 NormalRV *aStdNormRV = 0;
00109 aStdNormRV = new NormalRV(1,0.0,1.0,0.0);
00110
00111
00112
00113 if (aStdNormRV==0) {
00114 opserr << "CStdLibRandGenerator::generate_nIndependentStdNormalNumbers() - " << endln
00115 << " out of memory while instantiating internal objects." << endln;
00116 return -1;
00117 }
00118
00119
00120
00121 if (seedIn != 0) {
00122 srand(seedIn);
00123 }
00124 for ( j=0; j<n; j++)
00125 {
00126
00127 randomNumberBetween0AndRAND_MAX = rand();
00128
00129
00130 randomNumberBetween0And1 = (double)randomNumberBetween0AndRAND_MAX/RAND_MAX;
00131
00132
00133
00134 if (randomNumberBetween0And1 == 0.0) {
00135 randomNumberBetween0And1 = 0.0000001;
00136 }
00137 if (randomNumberBetween0And1 == 1.0) {
00138 randomNumberBetween0And1 = 0.9999999;
00139 }
00140
00141
00142
00143
00144
00145
00146
00147 randomArray(j) = aStdNormRV->getInverseCDFvalue(randomNumberBetween0And1);
00148 }
00149 seed = randomNumberBetween0AndRAND_MAX;
00150
00151 if (generatedNumbers == 0) {
00152 generatedNumbers = new Vector(n);
00153 }
00154 else if (generatedNumbers->Size() != n) {
00155 delete generatedNumbers;
00156 generatedNumbers = new Vector(n);
00157 }
00158 (*generatedNumbers) = randomArray;
00159
00160 delete aStdNormRV;
00161
00162 return 0;
00163 }
00164
00165
00166
00167 Vector
00168 CStdLibRandGenerator::getGeneratedNumbers()
00169 {
00170 return (*generatedNumbers);
00171 }
00172
00173
00174 int
00175 CStdLibRandGenerator::getSeed()
00176 {
00177 return seed;
00178 }