随机化技巧
随机化
使用随机化可以让某些算法在合法的时间内得到尽量正确的解(蒙特卡洛方法),或者在正确的情况下跑尽量少的时间(拉斯维加斯方法),期望是能接受的,是一种科学的技术方法。
比如字符串哈希,树哈希,序列哈希,各种哈希。
比如 AHC046 把,就是使用模拟退火算法,而且将修改也分成两种,按照某种概率选择某种修改,这样的算法表现会很好。
笔者还没学会遗传算法。
随机数的生成
1.1 mt19937
mt19937 可以生成 32 位无符号整数 j,基于梅森旋转算法,实用性较强。笔者习惯于使用时间的随机种子。
mt19937 rng(chrono::system_clock::now().time_since_epoch().count());
int rand1(int n){//慢
return rng()%n;
}
int rand2(int n){//比较慢,长
int k=__builtin_clz(n);
int res;
do{
res=rng()>>k;
}while(res>=n);
return res;
}
int rand3(int n){//快,短
return (unsigned long long)rng()*n>>32;
}
1.2 rand 函数
c++ 标准库函数,生成 \([0,32767]\) 的 32 位有符号整数
srand(time(NULL));
rand();
我不喜欢用。
1.3 xorshift
ULL xorshift(ULL x){//不要乱改参数
x^=x<<13;
x^=x>>7;
x^=x<<17;
return x;
}

浙公网安备 33010602011771号