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

信息检索与抽取

开发平台:

Unix_Linux

  1. // include.gens.setting.m
  2. //
  3. // 
  4. // Common code for simple generators
  5. // Random version 0.8
  6. // 
  7. // SETTING
  8. -setStateFromSeed: (unsigned) seed {
  9.    if (seed == 0)
  10.    [InvalidCombination raiseEvent:
  11.    "%s setStateFromSeed: seed %u cannot be zeron", genName, seed ];
  12.    singleInitialSeed = YES;
  13.    initialSeed = seed;
  14.    [self generateSeeds]; // fill initialSeeds[] using PMMLCG
  15.    [self setState]; // fill state from initialSeeds[]
  16.    return self;
  17. }
  18. -setStateFromSeeds: (unsigned *) seeds {
  19.    unsigned i;
  20.    for (i = 0; i < lengthOfSeedVector; i++)
  21.      if ( (seeds[i] > maxSeedValues[i]) || (seeds[i] == 0) )
  22.        [InvalidCombination raiseEvent:
  23.        "%s setStateFromSeeds: seeds[%u]=%u is too large (max %u) or zeron",
  24.        genName, i, seeds[i], maxSeedValues[i] ];
  25.    singleInitialSeed = NO;
  26.    initialSeed = 0; // this value not used 
  27.    for (i = 0; i < lengthOfSeedVector; i++)
  28.      initialSeeds[i] = seeds[i]; // fill initialSeeds[]
  29.    [self setState]; // fill state from initialSeeds[]
  30.    return self;
  31. }
  32. // Use an inline generator to create the full number of seeds required,
  33. // using the single seed initialSeed to seed this inline generator.
  34. // The specific generator used is a PMMLCG with a=69069 and m=2^32
  35. // (see Knuth vol. 2, table 1 on p. 102, line 25). Cf. MT19937 source.
  36. // This generator creates random nonzero 32-bit values, as long as
  37. // initialSeed is not zero.
  38. // Note: for now, this method is identical to that for split generators.
  39. -generateSeedVector {
  40.    unsigned ki;
  41.    unsigned z;
  42.    z = initialSeed;
  43.    // Mix the bits a bit:
  44.    for (ki=0; ki < 16; ki++)
  45.       z = (69069 * z); // modulo 2^32
  46.    // Generate seeds, as many as needed:
  47.    for (ki=0; ki < lengthOfSeedVector; ki++) {
  48.      z = (69069 * z); // modulo 2^32
  49.      initialSeeds[ki] = z;
  50.       
  51.    }
  52.    // Make sure we don't supply invalid seed values for this generator:
  53.    for (ki=0; ki < lengthOfSeedVector; ki++) {
  54.       if (maxSeedValues[ki] < 0xffffffff) { // avoid seeds > maxSeedValue
  55.         initialSeeds[ki] = initialSeeds[ki] % (maxSeedValues[ki] + 1);
  56.         if (initialSeeds[ki] == 0)  // avoid seed = 0
  57.           initialSeeds[ki] = 0xecec; // arbitrary value < 2^16
  58.       } 
  59.    }
  60.    return self;
  61. }
  62. -setAntithetic: (BOOL) antiT {
  63.    antiThetic = antiT;
  64.    return self;
  65. }
  66. //
  67. // include.gens.setting.m