随机数

引擎

engine e;
engine e(seed);
engine e(e2); copy构造
e.seed(); 将引擎设为初始状态
e.seed(seed); 将引擎设为根据seed形成的状态
e(); 返回下一个随机值,并前进其状态
e.discard(n); 前进接下来的n个状态,很像n此调用e(),但可能更快
e1 == e2;
e1 != e2;
ostrm << e; 将e的状态写入流
ostrm >> e; 从流中读取一个新的状态放入e

 

分布

均匀分布
uniform_int_distribution //short 、int 、long 、long long
uniform_real_distribution //float 、double 、long double

伯努利、泊松分布

正态分布
normal_distribution

抽样分布
discrete_distribution

distr::result_type 被生成值得算术形式
distr d; 默认构造
distr d(args);

d(e); 返回引擎e所生成的下一个值,e将推进其状态
d.min();
d.max();
d1 == d2;
d1 != d2;
ostrm << d;
istrm >> d;

distr::param_type 参数化类型
distr d(pt);创建一个分布,以param_type pt完成参数化
d.param(pt); 将之前参数化类型设置为pt
d.param();返回参数化类型
d(e,pt);根据引擎e和pt返回下一个值,并推进e的状态
d.pa


复数 <complex>

std::complex<double> c1(4.0, 3.0); //4+3i

std::complex<float> c2(std::polar(5.0, 0.75)); //极坐标 长5,相角为0.75

std::cout << "c1: " << c1 << std::endl;
std::cout << "c2: " << c2 << std::endl;

std::real(c2);
c2.real();
c2.real(1.7);

std::cout << c2.real() << std::endl;


std::imag(c2);
c2.imag();
c2.imag(1.7);

abs(c1); //长
norm(c1); //长的平方
std::arg(c2);//相角


polar(l,a);//产生一个临时的复数,极坐标表示法,相角a默认为0
conj(c);//产生一个临时的复数,是c的共轭复数
proj(c);//产生一个临时的复数,是在黎曼球面上的投影


全局数值函数 <cmath> 和 <cstdlib>

<cmath>:

pow() 幂函数
exp() 指数函数 y=2^x
sqrt() 平方根
log() 自然对数
log10()

sin()
cos()
tan()

sinh() 双曲正弦
cosh() 双曲余弦
tanh() 双曲正切

asin() 反正弦
acos()
atan()

atan2() 商的反正切
asinh() 反双曲正弦
acosh()
atanh()

ceil() 大于某个浮点数的最小整数
floor() 小于某个浮点数的最大整数

fabs() 浮点数的绝对值
fmod() 浮点数相除的余数

frexp() 将浮点数转换成小数部分和整数部分
ldexp() 将浮点数乘以2的某个整数次幂
modf() 将浮点数分离为带正负号的整数和分数

 

例子:

#include "stdafx.h"

#include <iostream>

#if 0
#include <random>
#include <algorithm>
#include <vector>

int main()
{
	int seed = time(NULL);//种子
	//引擎
	std::default_random_engine dre(seed);//种子相同的或不设置种子的其顺序是相同的
	//分布
	//最小值默认为0, 最大值默认为<numeric_limits<type>::max(),两者都包括
	std::uniform_int_distribution<int> di(10, 20);
	for (int i = 0; i < 20; ++i)
	{
		//std::cout << dre() << " ";
		std::cout << di(dre) << " ";
	}
	std::cout << std::endl;

	di.param();

	//std::default_random_engine dre1(seed);
	//for (int i = 0; i < 20; ++i)
	//{
	//	std::cout << di(dre1) << " ";
	//}
	//std::cout << std::endl;


	std::uniform_real_distribution<double> dr(10, 20);//不包括20,默认为[0.0, 0.999...) 即dr(0.0, 1.0);
	for (int i = 0; i < 8; ++i)
	{
		std::cout << dr(dre) << " ";
	}
	std::cout << std::endl;


	//弄乱容器或区间内的元素
	std::vector<int> v = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	std::shuffle(v.begin(), v.end(), dre);
	for (int i = 0; i < v.size(); ++i)
	{
		std::cout << v[i] << " ";
	}
	std::cout << std::endl;


	std::shuffle(v.begin(), v.end(), std::default_random_engine());//传入一个临时引擎,会导致每次洗牌的方法相同
	for (int i = 0; i < v.size(); ++i)
	{
		std::cout << v[i] << " ";
	}
	std::cout << std::endl;


	std::uniform_int_distribution<> d(0, 20);
	d.a(); d.param().a();//最小值
	d.b(); d.param().b();//最大值

	std::uniform_int_distribution<>::param_type pt(100, 200);
	d(dre, pt);//在pt返回生成一个随机值
	d.param(pt);//替换参数化
}
#endif // 0

//复数
#include <complex>

int main()
{
	std::complex<double> c1(4.0, 3.0); //4+3i

	std::complex<float> c2(std::polar(5.0, 0.75)); //极坐标 长5,相角为0.75

	std::cout << "c1: " << c1 << std::endl;
	std::cout << "c2: " << c2 << std::endl;

	std::real(c2);
	c2.real();
	c2.real(1.7);
	std::cout << c2.real() << std::endl;

}

  

posted @ 2018-07-31 00:32  xslwm  阅读(396)  评论(0编辑  收藏  举报