随机化Tricks

参阅:
https://zh.cppreference.com/w/cpp/numeric/random
https://zh.cppreference.com/w/cpp/header/random


  1. 使用random_device[1]作为种子
  1. 新建mt19937随机数

  2. uniform_int_distribution[2](整数范围)、uniform_real_distribution[3](实数范围)限定范围

Code:

// C++11
#include<cstdio>
#include<random>
#include<chrono>
using namespace std;
#define clock() (chrono::steady_clock::now())
const int n=1e7;
int a[11];
int main() {
	mt19937 rnd(random_device{}());
	uniform_int_distribution<int> int_dist(1,10); // 整数
	uniform_real_distribution<double> real_dist(1,10); // 实数
	printf("%d %lf\n",int_dist(rnd),real_dist(rnd));
	auto st=clock();
	for(int i=1; i<=n; ++i)
		++a[int_dist(rnd)];
	printf("int_dist costed time: %.3lfs\n",chrono::duration<double>(clock()-st).count());
	for(int i=1; i<=10; ++i)
		printf("%d%c",a[i]," \n"[i==10]);
	st=clock();
	for(int i=1; i<=n; ++i)
		real_dist(rnd);
	printf("real_dist costed time: %.3lfs\n",chrono::duration<double>(clock()-st).count());
	return 0;
}

A possible output:

7 6.686022
int_dist costed time: 0.130s
1001752 997709 1000564 1000381 999916 997915 1000190 999793 999096 1002684
real_dist costed time: 0.270s

附:mt19937的常用成员函数

  1. 构造函数:

    • mt19937():默认构造函数,使用默认的种子初始化随机数引擎。

    • mt19937(unsigned int seed):使用指定的种子初始化随机数引擎。

  2. 种子操作函数:

    • seed():设置种子值为默认值。

    • seed(unsigned int seed):设置新的种子值。

  3. 随机数生成函数:

    • operator():生成一个32位的随机整数。
  4. 辅助函数:

    • discard(unsigned long long z):等同于执行z次operator(),以丢弃z次生成的随机数。

    • min():获取可生成的最小随机数值。

    • max():获取可生成的最大随机数值。


  1. https://zh.cppreference.com/w/cpp/numeric/random/random_device ↩︎

  2. https://zh.cppreference.com/w/cpp/numeric/random/uniform_real_distribution ↩︎

  3. https://zh.cppreference.com/w/cpp/numeric/random/uniform_int_distribution ↩︎

posted @ 2023-12-12 16:27  lnw143  阅读(94)  评论(0编辑  收藏  举报