double Darts(int n) { // 用随机投点法计算值 static RandomNumber dart; int k=0; for (int i=1;i <=n;i++) { double x=dart.fRandom(); double y=dart.fRandom(); if ((x*x+y*y)<=1) k++; } return 4 * k / double(n); }
计算定积分
1 2 3 4 5 6 7 8 9 10 11 12 13 14
double Darts(int n) { // 用随机投点法计算定积分 static RandomNumber dart; int k = 0; for (int i = 1; i <= n; i++) { double x = dart.fRandom(); double y = dart.fRandom(); if (y < f(x)) { k++; } } return k / double(n); }
注:上面两题本质上都是投点,限制点在目标区域,计算目标区域中点在整个区域中个数
舍伍德(Sher wood)
随机洗牌
算法思想
从位置1取到位置n,每个对应位置随机选一个位置,将两个位置的牌对调
1 2 3 4 5 6 7 8 9
template<class Type> void Shuffle(Type a[], int n) // 随机洗牌算法 { static RandomNumber rnd; for (int i=1;i<n;i++) { int j=rnd.Random(n-i)+i; // 产生[i, n-1]随机数 Swap(a[i-1], a[j]); } }