随机化算法——随机数 概率算法的一个基本特征是对所求解问题的同一实例用同一概率算法求解两次可能得到完全不同的效果。这两次求解问题所需的时间甚至所得到的结果可能会有相当大的差别。一般情况下,可将概率算法大致分为四类:数值概率算法,蒙特卡罗(Monte Carlo)算法,拉斯维加斯(Las Vegas)算法和舍伍德(Sherwood)算法。
0 Y, ?. y% Q C8 t 随机数在概率算法设计中扮演着十分重要的角色。在现实计算机上无法产生真正的随机数,因此在概率算法中使用的随机数都是一定程度上随机的,即伪随机数。
7 q6 l9 z1 ]* N* D) z 产生随机数最常用的方法是线性同余法。由线性同余法产生的随机序列a1,a2,…,an满足1 P8 U9 W" T( o2 v
1.a0=d
" b* H3 r: e+ U8 S4 ^ 2.an=(b*an-1+c)mod m (n=1,2…….)# |2 M- J1 J) D1 \
其中,b>0, c>=0, d>=m。d称为该随机序列的种子。
3 |/ q* l/ ~, Q* p) J4 z4 R x 一般情况下,取gcd(m, b)=1,因此可取b为一素数。
$ _# h a# x. G! E 这是一个随机数类:6 o- j- v1 e: n
代码
: {: f) N) ~. z0 K const unsigned long maxshort = 65535L;
) H2 D) R. P+ z/ F# ]6 U) ?8 Z4 R const unsigned long multiplier = 1194211693L;
8 ]7 c& T$ o* x* u' B. A: u2 S const unsigned long adder = 12345L;( Q1 p3 }8 W4 Q1 n3 ^$ e; d( Q. U- q
class RandomNumber{
( M/ f; E2 t6 l- T( I private:* N3 w; Y7 E% @" I
// 当前种子
! u* x5 y' E( I: c& X unsigned long randSeed;" F7 J; r# g$ s. }: T8 |% h
public:
$ M# L0 g7 ?0 o" ?7 q. F // 构造函数,默认值0表示由系统自动产生种子9 Q/ {2 g0 q6 _, @! G. Y
RandomNumber(unsigned long s = 0);" ?! I) _- c! K: f3 }% L/ ]) G
// 产生0 ~ n-1之间的随机整数; W6 k% B$ q, K: n+ V2 ]
unsigned short Random(unsigned long n); m, x8 }( W1 s1 ^! Q& |
// 产生[0, 1) 之间的随机实数
^$ t( J7 w; h, O0 q! e* {. g double fRandom();8 N& \1 B. Y# R
};
: `6 k3 d! ]9 r4 O9 M // 产生种子
) [2 D1 ]' S2 ? RandomNumber::RandomNumber(unsigned long s) }: z; S' w% k; H8 b! B6 p
{
9 k1 l& z! ]9 n3 g; b9 A. q- G! ]. W7 ~: ~) ]! }, J7 B
if(s == 0) |