随机化技巧

随机化

使用随机化可以让某些算法在合法的时间内得到尽量正确的解(蒙特卡洛方法),或者在正确的情况下跑尽量少的时间(拉斯维加斯方法),期望是能接受的,是一种科学的技术方法。

比如字符串哈希,树哈希,序列哈希,各种哈希。

比如 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;
}

Reference

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;
}
posted @ 2024-02-27 00:16  妖灵梦  阅读(58)  评论(0)    收藏  举报