ランダム関数の内部メカニズム


1.種はすべて1から
 
   
   
   
   
  1. #include 
  2.  
  3. extern int rand0(void); 
  4.  
  5. int main(void){ 
  6.     int count; 
  7.      
  8.     for(count=0;count<5;count++){ 
  9.         printf("%d
    "
    ,rand0()); 
  10.     } 
  11.     getchar(); 

 
   
   
   
   
  1. #include 
  2. static unsigned int next = 1;// ,int long   
  3. int rand0(void){// , ,   
  4.     next = next * 1103515245 + 12345;//next , , ,   
  5.     return (unsigned int)(next/65535)%32768;// unsigned int   

 
2.srand手動入力シード
   
   
   
   
  1. #include  
  2.   
  3. extern int rand1(void);  
  4. extern void srand1(unsigned int x);  
  5.   
  6. int main(void){  
  7.     int count;  
  8.     unsigned seed;  
  9.       
  10.     printf("Please enter your choice:
    "
    );  
  11.     while(scanf("%u",&seed) == 1){ //   
  12.         srand1(seed);  
  13.         for(count=0;count<5;count++){  
  14.             printf("%hd
    "
    ,rand1());   
  15.         }  
  16.         printf("Please enter again ,q to quit
    "
    ); 
  17.     }  
  18.     printf("Done
    "
    );  
  19.     return 0;  

 
   
   
   
   
  1. static unsigned long int next = 1; //rand srand   
  2. int rand1(void){  
  3.     next = next * 1103515245 + 12345;  
  4.     return (unsigned int)(next/65536)%32768;  
  5. }  
  6. void srand1(unsigned int seed){  
  7.     next = seed;  

3.time関数を使用してシードを自動的に設定する
 
   
   
   
   
  1. #include 
  2. #include 
  3.  
  4. extern int rand2(void); 
  5. extern void srand2(unsigned int seed); 
  6.  
  7. int main(void){ 
  8.     int count; 
  9.      
  10.     srand2((unsigned int)time(0));//time ,   
  11.     for(count=0;count<5;count++){ 
  12.         printf("%d
    "
    ,rand2()); 
  13.     } 
  14.     getchar(); 
  15.     return 0; 

 
 
   
   
   
   
  1. static unsigned long int  next = 1; 
  2. int rand2(void){ 
  3.     next = next * 1103515245 + 12345; 
  4.     return (unsigned int)(next/65536)%32768; 
  5. void srand2(unsigned int seed){ 
  6.     next = seed;