home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   comp.lang.c      Meh, in C you gotta define EVERYTHING      243,242 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 242,520 of 243,242   
   Janis Papanagnou to James Kuyper   
   Re: srand(0)   
   22 Dec 25 18:41:10   
   
   From: janis_papanagnou+ng@hotmail.com   
      
   On 2025-12-22 18:13, James Kuyper wrote:   
   > On 2025-12-22 07:18, Janis Papanagnou wrote:   
   >> On 2025-12-22 12:44, James Kuyper wrote:   
   >>> On 2025-12-22 03:48, Michael Sanders wrote:   
   >>>> Is it incorrect to use 0 (zero) to seed srand()?   
   >>>>   
   >>>> int seed = (argc >= 2 && strlen(argv[1]) == 9)   
   >>>> ? atoi(argv[1])   
   >>>> : (int)(time(NULL) % 900000000 + 100000000);   
   >>>>   
   >>>> srand(seed);   
   >>>   
   >>> No, why whould you think so?   
   >>   
   >> There's number sequence generators that produce 0 sequences if seeded   
   >> with 0. ...   
   >   
   > The details of how the seed affects the random number sequence are   
   > unspecified by the standard. I personally would consider a pseudo-random   
   > number generator to be quite defective if there were any seed that   
   > produced a constant output.   
      
   I wouldn't have mentioned that if there weren't a whole class of   
   such functions that expose exactly that behavior by design. Have   
   a look for PN-(Pseudo Noise-)generators and LFSR (Linear Feedback   
   Shift Registers). These have been defined to produce random noise   
   (bit pattern with good statistical distribution). With sophisticated   
   generator polynomials they produce also sequences of maximum period;   
   say, for N=31 a non-repeating sequence of length 2^N - 1. The one   
   element that is missing from the sequence is the 0 (that reproduces   
   itself).   
      
   Technically you pick some bit-values from fixed positions (depending   
   on the generator polynomial) of the register and xor the bits to shift   
   the result into the register. Here's ad hoc an example...   
      
   #include    
   #include    
      
   int main ()   
   {   
        uint32_t init = 0x00000038;   
        uint32_t reg = init;   
        uint32_t new_bit;   
        int count = 0;   
        do {   
            new_bit = ((reg >> 2) + (reg >> 4) + (reg >> 6) + (reg >> 30))   
   & 0x1;   
            reg <<= 1;   
            reg |= new_bit;   
            reg &= 0x7fffffff;   
            count++;   
        } while (reg != init);   
        printf ("period: %d\n", count);   
   }   
      
      
   Janis   
      
   >> [...]   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca