随笔-11  评论-20  文章-0  trackbacks-0
 1#include <iostream>
 2#include <time.h>
 3
 4using namespace std;
 5
 6// generate random numbers
 7class randomNumber
 8{
 9public:
10    // initialize the random number generator
11    randomNumber(long s = 0);
12
13    // return a 32-bit random integer m, 1 <= m <= 2^31-2
14    long random();
15
16    // return a 32-bit random integer m, 0 <= m <= n-1,
17    // where n <= 2^31-1
18    long random(long n);
19
20    // return a real number x, 0 <= x < 1
21    double frandom();
22
23private:
24    static const long A;
25    static const long M;
26    static const long Q;
27    static const long R;
28
29    long seed;
30}
;
31
32const long randomNumber::A = 48271;
33const long randomNumber::M = 2147483647;
34const long randomNumber::Q = M / A;
35const long randomNumber::R = M % A;
36
37randomNumber::randomNumber(long s)
38{
39    if (s < 0)
40        s = 0;
41
42    if (s == 0)
43    {
44        // get time of day in seconds since 12:00 AM,
45        // January 1, 1970
46        long t_time = time(NULL);
47
48        // mix-up bits by squaring
49        t_time *= t_time;
50        // result can overflow. handle cases
51        // > 0, < 0, = 0
52        if (t_time > 0)
53            s = t_time ^ 0x5EECE66DL;
54        else if (t_time < 0)
55            s = (t_time & 0x7fffffff^ 0x5EECE66DL;
56        else
57            s = 0x5EECE66DL;
58    }

59
60    seed = s;
61}

62
63long randomNumber::random()
64{
65    long tmpSeed = A * ( seed % Q ) - R * ( seed / Q );
66
67    if( tmpSeed >= 0 )
68         seed = tmpSeed;
69    else
70         seed = tmpSeed + M;
71
72    return seed;
73}

74
75long randomNumber::random(long n)
76{
77    double fraction = double(random())/double(M);
78
79    return int(fraction * n);
80}

81
82double randomNumber::frandom()
83{
84    return double(random())/double(M);
85}

86
posted on 2009-08-24 19:35 diwayou 阅读(1908) 评论(1)  编辑 收藏 引用 所属分类: 数据结构与算法

评论:
# re: 生成随机数的一个工具类 2011-04-05 18:12 | shilei230
能否解释下什么原理不?这里的魔数真不少  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理