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

信息检索与抽取

开发平台:

Unix_Linux

  1. // include.xgens.setting.m
  2. // 
  3. // 
  4. // Common code for split generators
  5. // Random version 0.8
  6. // 
  7. // SETTING
  8. // This method called from -initState, -setState, -setStateFrom:
  9. -(unsigned) MultModMs: (unsigned) s t: (unsigned) t M: (unsigned) M
  10. /* Returns (s*t) MOD M.  Assumes that s < M and t < M.              */
  11. /* See L'Ecuyer and Cote (1991).                                    */
  12. /* This version uses 64-bit math instead, with no speed penalty. ST */
  13. {
  14. unsigned long long int ls, lt, lM, lWork;
  15. unsigned ret;
  16.    ls = s; lt = t; lM = M; // to 64 bits
  17.    lWork = (ls * lt) % lM; // 64 bit math
  18.    ret = lWork; // back to 32 bits
  19.    return ret;
  20. }
  21. -setStateFromSeed: (unsigned) seed { // called from +create*
  22.    if (seed == 0)
  23.    [InvalidCombination raiseEvent:
  24.    "%s setStateFromSeed: seed %u cannot be zeron", genName, seed ];
  25.    singleInitialSeed = YES;
  26.    initialSeed = seed;
  27.    [self generateSeeds]; // fill initialSeeds[] using PMMLCG
  28.    [self setState]; // fill state from initialSeeds[]
  29.    return self;
  30. }
  31. -setStateFromSeeds: (unsigned *) seeds { // called from +create*
  32.    unsigned i;
  33.    for (i = 0; i < lengthOfSeedVector; i++)
  34.      if ( (seeds[i] > maxSeedValues[i]) || (seeds[i] == 0) )
  35.        [InvalidCombination raiseEvent:
  36.        "%s setStateFromSeeds: seeds[%u]=%u is too large (max %u) or zeron",
  37.        genName, i, seeds[i], maxSeedValues[i] ];
  38.    singleInitialSeed = NO;
  39.    initialSeed = 0; // this value not used 
  40.    for (i = 0; i < lengthOfSeedVector; i++) {
  41.      initialSeeds[i] = seeds[i];
  42.      vGenArr[0].Ig[i] = initialSeeds[i] + 1;
  43.    }
  44.    [self setState]; // fill state from initialSeeds[]
  45.    return self;
  46. }
  47. // Use an inline generator to create the full number of seeds required,
  48. // using the single seed initialSeed to seed this inline generator.
  49. // The specific generator used is a PMMLCG with a=69069 and m=2^32
  50. // (see Knuth vol. 2, table 1 on p. 102, line 25). Cf. MT19937 source.
  51. // This generator creates random nonzero 32-bit values, as long as
  52. // initialSeed is not zero.
  53. // Note: this method is identical to that for simple generators.
  54. -generateSeedVector {
  55.    unsigned ki;
  56.    unsigned z;
  57.    z = initialSeed;
  58.    // Mix the bits a bit:
  59.    for (ki=0; ki < 16; ki++)
  60.       z = (69069 * z); // modulo 2^32
  61.    // Generate seeds, as many as needed:
  62.    for (ki=0; ki < lengthOfSeedVector; ki++) {
  63.      z = (69069 * z); // modulo 2^32
  64.      initialSeeds[ki] = z;
  65.       
  66.    }
  67.    // Make sure we don't supply invalid seed values for this generator:
  68.    for (ki=0; ki < lengthOfSeedVector; ki++) {
  69.       if (maxSeedValues[ki] < 0xffffffff) { // avoid seeds > maxSeedValue
  70.         initialSeeds[ki] = initialSeeds[ki] % (maxSeedValues[ki] + 1);
  71.         if (initialSeeds[ki] == 0)  // avoid seed = 0
  72.           initialSeeds[ki] = 0xecec; // arbitrary value < 2^16
  73.       } 
  74.    }
  75.    return self;
  76. }
  77. -setAntithetic: (BOOL) antiT {
  78.    antiThetic = antiT;
  79.    return self;
  80. }
  81. -initGenerator: (unsigned) vGen {
  82.    unsigned j;
  83. // Reset chosen virtual generator to segment #0 (initial seed)
  84.    for (j=0; j<COMPONENTS; j++)
  85.    {
  86.      vGenArr[vGen].Lg[j] = vGenArr[vGen].Ig[j]; // segmentSeed = initialSeed
  87.      vGenArr[vGen].Cg[j] = vGenArr[vGen].Lg[j]; // state = segmentSeed
  88.    }
  89.    vGenArr[vGen].currentCount = 0; // restart counter
  90.    vGenArr[vGen].currentSegment = 0; // start in segment #0
  91.    return self;
  92. }
  93. -initAll {
  94.    unsigned int i;
  95.      for (i=0; i<numGenerators; i++) 
  96.      [self initGenerator: i];
  97.    return self;
  98. }
  99. // include.xgens.setting.m