include.xgens.using.m
上传用户:shenzhenrh
上传日期:2013-05-12
资源大小:2904k
文件大小:5k
源码类别:

信息检索与抽取

开发平台:

Unix_Linux

  1. // include.xgens.using.m
  2. // 
  3. // 
  4. // Common code for split generators
  5. // Random version 0.8
  6. // 
  7. // USING
  8. - (void)drop
  9. {
  10.   [[self getZone] free: vGenArr];
  11.   [super drop];
  12. }
  13. -restartGenerator: (unsigned) vGen {
  14.    unsigned j;
  15. // Reset chosen virtual generator to beginning of current segment
  16.    for (j=0; j<COMPONENTS; j++)
  17.    {
  18.      vGenArr[vGen].Cg[j] = vGenArr[vGen].Lg[j]; // reset state = segmentSeed
  19.    }
  20.    vGenArr[vGen].currentCount = 0; // restart counter
  21.    return self;
  22. }
  23. -advanceGenerator: (unsigned) vGen {
  24.    unsigned j;
  25. // Advance chosen virtual generator to beginning of next segment
  26.    for (j=0; j<COMPONENTS; j++)
  27.    {
  28.    vGenArr[vGen].Lg[j] = [self MultModMs: aw[j] t: vGenArr[vGen].Lg[j] M: m[j]];
  29.    vGenArr[vGen].Cg[j] = vGenArr[vGen].Lg[j];
  30.    }
  31.    vGenArr[vGen].currentCount = 0; // restart counter
  32.    vGenArr[vGen].currentSegment++; // going to next segment
  33.    if (vGenArr[vGen].currentSegment > segmentMax)
  34.    [InvalidCombination raiseEvent:
  35.    "%s advanceGenerator: %u exceeding limit on #segments %24qun", 
  36.    genName, vGen, vGenArr[vGen].currentSegment];
  37.    return self;
  38. }
  39. -jumpGenerator: (unsigned) vGen toSegment: (unsigned long long int) seg {
  40.    unsigned long long int i;
  41.    if (seg > segmentMax)
  42.    [InvalidCombination raiseEvent:
  43.    "%s jumpGenerator: segment chosen is too big! %24qun", genName,seg];
  44. // Position chosen virtual generator to start of specified segment 
  45.    [self initGenerator: vGen];
  46.    for (i=0; i<seg; i++)
  47.      [self advanceGenerator: vGen];
  48.    return self;
  49. }
  50. -restartAll {
  51.    unsigned int i;
  52.      for (i=0; i<numGenerators; i++) 
  53.      [self restartGenerator: i];
  54.    return self;
  55. }
  56. -advanceAll {
  57.    unsigned int i;
  58.      for (i=0; i<numGenerators; i++) 
  59.      [self advanceGenerator: i];
  60.    return self;
  61. }
  62. -jumpAllToSegment: (unsigned long long int) seg {
  63.    unsigned int i;
  64.      for (i=0; i<numGenerators; i++) 
  65.      [self jumpGenerator: i toSegment: seg];
  66.    return self;
  67. }
  68. -(BOOL) getAntithetic {
  69.    return antiThetic;
  70. }
  71. -(unsigned) getUnsignedMax {
  72.    return unsignedMax;
  73. }
  74. -(unsigned) lengthOfSeedVector {
  75.    return lengthOfSeedVector;
  76. }
  77. -(unsigned) getMaxSeedValue {
  78.    return 0xffffffff;
  79. }
  80. -(unsigned *) getMaxSeedValues {
  81.    return &(maxSeedValues[0]);
  82. }
  83. -(unsigned) getInitialSeed {
  84.    return initialSeed;
  85. }
  86. -(unsigned *) getInitialSeeds {
  87.    return &(initialSeeds[0]);
  88. }
  89. -(const char *) getName {
  90.    return SSTRDUP (genName);
  91. }
  92. -(unsigned) getMagic {
  93.    return genMagic;
  94. }
  95. -(unsigned) getStateSize {
  96.    return stateSize;
  97. }
  98. -(unsigned) getNumGenerators {
  99.    return numGenerators;
  100. }
  101. -(unsigned) getNumSegments {
  102.    return numSegments;
  103. }
  104. -(unsigned) getSegmentLength {
  105.    return segmentLength;
  106. }
  107. -(unsigned long long int) getCurrentCount: (unsigned) vGen {
  108.    return vGenArr[vGen].currentCount;
  109. }
  110. -(unsigned long long int) getCurrentSegment: (unsigned) vGen {
  111.    return vGenArr[vGen].currentSegment;
  112. }
  113. // These 3 methods are implemented following L'Ecuyer,
  114. // for debug purposes only. Not published.
  115. -(unsigned *) getInitialSeeds: (unsigned) vGen {
  116.    return &(vGenArr[vGen].Ig[0]);
  117. }
  118. -(unsigned *) getLastSeeds: (unsigned) vGen {
  119.    return &(vGenArr[vGen].Lg[0]);
  120. }
  121. -(unsigned *) getCurrentSeeds: (unsigned) vGen {
  122.    return &(vGenArr[vGen].Cg[0]);
  123. }
  124. // Change in version 0.75:
  125. // -getDoubleSample no longer calls -getLongDoubleSample,
  126. // since doing so made the method non-portable.
  127. // ----- Producing generator output: -----
  128. -(float) getFloatSample: (unsigned) vGen {
  129.    double dd;
  130.    // One 32-bit unsigned random number is used
  131.    // to fill the 24-bit mantissa of a float
  132.    dd = invModMult * [self getUnsignedSample: vGen];
  133.    return (float) dd;
  134. }
  135. -(double) getThinDoubleSample: (unsigned) vGen {
  136.    double dd;
  137.    // *One single* 32-bit unsigned random number is used
  138.    // to fill the 53-bit mantissa of a double
  139.    dd = invModMult * [self getUnsignedSample: vGen];
  140.    return dd;
  141. }
  142. -(double) getDoubleSample: (unsigned) vGen {
  143.    double dd;
  144.    // *Two* 32-bit unsigned random numbers are used
  145.    // to fill the 53-bit mantissa of a double.
  146.    dd = invModMult  * [self getUnsignedSample: vGen]
  147.       + invModMult2 * [self getUnsignedSample: vGen];
  148.    return dd;
  149. }
  150. // NOTE: since the size of a long double is machine dependent,
  151. // using this method may render the simulation non-portable!
  152. -(long double) getLongDoubleSample: (unsigned) vGen {
  153.    long double ld;
  154.    // Two 32-bit unsigned random numbers are used
  155.    // to fill the mantissa of a long double.
  156.    ld = (long double) invModMult  * [self getUnsignedSample: vGen]
  157.       + (long double) invModMult2 * [self getUnsignedSample: vGen];
  158.    return ld;
  159. }
  160. // include.xgens.setting.m