论坛首页 编程语言技术论坛

C的亂數產生器

浏览 18869 次
该帖已经被评为良好帖
作者 正文
   发表时间:2007-02-12  
C
cpp 代码
  1. // file: sj03.h   
  2.   
  3. void rnd1(int *s1);   
  4. void rnd2(int *s1, double *x);   
  5. void swap_int(int *x, int *y);   
  6. void irnd(int *s1, int i1, int i2, int *ii);   
  7. void init_rnd(int *s1);   
  8. // ----------------------------------------------   
  9.   
  10. void rnd1(int *s1)   
  11. {   
  12.     // r(n)= (r(n-1)*a + b) MOD c   
  13.     // a= 7^5= 16807.0   
  14.     // b= 0.0   
  15.     // c= 2147483647.0   
  16.     // ----------------------------------------------   
  17.   
  18.     // double r1, r2, r3;   
  19.     // r1= (double) (*s1);   
  20.     // r2= r1*16807.0;   
  21.     // r3= fmod(r2, 2147483647.0);   
  22.   
  23.     (*s1)= (int) ((fmod((((double) (*s1))*16807.0), 2147483647.0)) + 0.5);   
  24. }// end rnd1()   
  25. // ----------------------------------------------   
  26.   
  27. void rnd2(int *s1, double *x)   
  28. {   
  29.     rnd1(s1);   
  30.     *x= ((double) *s1)/2147483647.0;   
  31. }// end rnd2()   
  32. // ----------------------------------------------   
  33.   
  34. void swap_int(int *x, int *y)   
  35. {   
  36.     int z;   
  37.   
  38.     z= *x;   
  39.     *x= *y;   
  40.     *y= z;   
  41. }// end swap_int()   
  42. // ----------------------------------------------   
  43.   
  44. void irnd(int *s1, int i1, int i2, int *ii)   
  45. {   
  46.     double x;   
  47.     rnd2(s1, &x);   
  48.   
  49.     // I hope i1 <= i2   
  50.     if (i1 > i2) {   
  51.         swap_int(&i1, &i2);   
  52.     }   
  53.   
  54.     *ii= ((int) (x*(i2 - i1 + 1))) + i1;   
  55. }// end irnd()   
  56. // ----------------------------------------------   
  57.   
  58. void init_rnd(int *s1)   
  59. {   
  60.     int t1, t2;   
  61.     time1(&t1);   
  62.     // ----------------------------------------------   
  63.   
  64.     t2= t1;   
  65.     do {   
  66.         time1(&t1);   
  67.     } while (t1 == t2);   
  68.     // t1 <> t2   
  69.     // ----------------------------------------------   
  70.   
  71.     *s1= t1;   
  72.     for (int i=0;i<300;i++) {   
  73.         rnd1(s1);   
  74.     }   
  75. }// end init_rnd()   

自己寫的。

 

   发表时间:2007-02-12  
为什么说是乱数呢?不是随机数么?
还用的繁体字,台湾人么?
0 请登录后投票
   发表时间:2007-02-13  
这么复杂的程序,连个注释都没有……
0 请登录后投票
   发表时间:2007-02-13  
刑天战士 写道
这么复杂的程序,连个注释都没有……

程式的本身,就是最好的注釋。
看不懂的,可以提問啊

0 请登录后投票
   发表时间:2007-02-13  
timel这个函数是干什么用的?ANSI_C的?没用过……
0 请登录后投票
   发表时间:2007-02-13  
随机数如果以时间作为种子总是不完全的
0 请登录后投票
   发表时间:2007-02-13  
time1() 是自己寫的


// file: sj02.h    
   
void time1(int *t1);    
void time2(int t1, double *dt);    
// ----------------------------------------------    
   
void time1(int *t1)    
{    
    struct _timeb timebuffer;    
    _ftime( &timebuffer );    
   
    *t1= timebuffer.time + 8L*60*60;    
    (*t1)%= (1L*24*60*60);    
    *t1= (*t1)*1000L + timebuffer.millitm;    
}// end time1()    
// ----------------------------------------------    
   
void time2(int t1, double *dt)    
{    
    // get t2    
    int t2;    
    time1(&t2);    
    // ----------------------------------------------    
   
    *dt= (t2 - t1)/1000.0;    
   
    // dt must >= 0.0    
    if ((*dt) < 0.0) {    
        (*dt)+= 1.0*24.0*60.0*60.0;    
    }    
}// end time2()    
// ----------------------------------------------    
0 请登录后投票
   发表时间:2007-02-13  
  
    *s1= t1;    
    for (int i=0;i<300> 
        rnd1(s1);    
    }    



我有 空跑 300次,就是 為了避開 呼叫時間函數的缺點。

那麼,請問你有更好的 idea 嗎?

0 请登录后投票
   发表时间:2007-02-15  
rand的问题比较经典的可以去参考Donald Knuth - The Art of Computer Programming, Volume 2: Seminumerical Algorithms中的内容(我也没有怎么仔细研究过).
不过如果是Windows下,可以使用系统提供的一个随机数函数CryptGenRandom, 将大大的提高随机数的安全性.
0 请登录后投票
   发表时间:2007-02-15  
hurricane1026 写道
Lucas Lee 写道
为什么说是乱数呢?不是随机数么?
还用的繁体字,台湾人么?

这位大叔当然是台湾人了。而且50多了。尊重些前辈吧。

兩岸相隔 (96 - 38) 60年,總是會有一些名詞使用上的差異,
了解就好。
亂數,就是 隨機數。了解就好。

使用繁體字,也不是個人的錯。
況且, 想要了解中國 五千年的歷史文化寶藏,
不靠繁體字是 無法辦到的。

禮失而求諸野。古有明訓。
兩岸應該合作,才能迎頭趕上世界水平。

中芯,宏力等中國晶片製造公司,不都是台胞
帶著金錢 技術 人才過去而 建立起來的。

不多說了。


0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics