关于随机漫步的介绍参见:随机漫步理论

通过cpp实现随机漫步的关系模型。(计算移动目标位移需要随机漫步多少步)

通过实践才能知道自己的不足,仅仅是看书难免会感觉生疏。

下面是实现:
一共3个文件,分别是Vector.h–> 矢量类定义,Vector.cpp–>矢量类的具体实现,main.cpp–>随机漫步模型的具体实现。

//
// Created by cat on 2018/1/1.
//#ifndef CPP02_STEP_H
#define CPP02_STEP_H#include <iostream>
#include <cmath>
#include <math.h>#define Math_PI 3.1415927
/*** 矢量类*/
namespace VECTOR {class Vector {public:enum Mode {/*正坐标*/ RECT,/*极坐标*/ POL};private:Mode currentMode;double angle; // 角度 (0~360度)double length; // 步长��(1~3m)double xLen; // x 方向的位移double yLen; // y 方向的位移Vector set2RECT() const; // 转成正坐标Vector set2POL() const; // 转成级坐标double radian2Angle(double radian) const // 弧度转角度{return 1.0 * radian / Math_PI * 180;}double angle2Radian(double angle) const // 角度转弧度{return 1.0 * angle * Math_PI / 180;}public:Vector(double num1 = 0, double num2 = 0, Mode currentMode = POL);Vector(const Vector &data);double getLength() {return this->length;};virtual ~Vector();void reset(double num1 = 0, double num2 = 0, Mode currentMode = POL);// operatorVector operator*(double factor);Vector operator*=(double factor);Vector operator-();// friend operatorfriend std::ostream &operator<<(std::ostream &os, Vector &obj); // toStringfriend Vector operator+(const Vector &one, const Vector &another);friend Vector operator+=(Vector &one, const Vector &another);friend Vector operator-(const Vector &one, const Vector &another);friend Vector operator-=(Vector &one, const Vector &another);friend Vector operator*(double factor,  Vector &obj);friend Vector operator*=(double factor, Vector &obj);};}#endif //CPP02_STEP_H

//
// Created by cat on 2018/1/1.
//#include "Vector.h"
#include <cmath>namespace VECTOR {Vector::Vector(const Vector &data) {this->xLen = data.xLen;this->yLen = data.yLen;this->angle = data.angle;this->length = data.length;this->currentMode = data.currentMode;}Vector::Vector(double num1,double num2,Vector::Mode currentMode) {reset(num1, num2, currentMode);}void Vector::reset(double num1,double num2,Vector::Mode currentMode) {this->currentMode = currentMode;if (this->currentMode == POL) {this->angle = num1;this->length = num2;this->xLen = sin(radian2Angle(num1)) * num2;this->yLen = cos(radian2Angle(num1)) * num2;} else if (this->currentMode == RECT) {this->xLen = num1;this->yLen = num2;this->angle = radian2Angle(atan2(this->yLen, this->xLen));double len2 = pow(this->xLen, 2) + pow(this->yLen, 2);this->length = pow(len2, 0.5);} else {throw "error!";}}Vector::~Vector() {this->currentMode = POL;this->angle = 0;this->length = 0;this->xLen = 0;this->yLen = 0;}Vector Vector::set2RECT() const {Vector v = Vector(*this);if (this->currentMode == Vector::RECT) {return v;} else if (this->currentMode == Vector::POL) {v.currentMode = Vector::RECT;v.xLen = this->length * cos(this->angle2Radian(this->angle));v.yLen = this->length * sin(this->angle2Radian(this->angle));}return v;}Vector Vector::set2POL() const {Vector v = Vector(*this);if (this->currentMode == Vector::POL) {return v;} else {v.currentMode = Vector::POL;v.angle = radian2Angle(atan2(this->yLen, this->xLen));double len2 = pow(this->xLen, 2) + pow(this->yLen, 2);v.length = pow(len2, 0.5);}return v;}Vector operator+(const Vector &a, const Vector &b) {Vector obj;Vector one, another;one = a.set2RECT();another = b.set2RECT();obj = Vector(one.xLen + another.xLen, one.yLen + another.yLen, Vector::RECT);return obj;}Vector VECTOR::operator+=(Vector &one, const Vector &another) {one = operator+(one, another);return one;}Vector operator-(const Vector &a, const Vector &b) {Vector one, another;Vector::Mode mode = one.currentMode;one = a.set2RECT();another = b.set2RECT();Vector v = Vector(one.xLen - another.xLen, one.yLen - another.yLen, Vector::RECT);v.currentMode = mode;return v;}Vector operator-=(Vector &one, const Vector &another) {one = operator-(one, another);return one;}Vector Vector::operator*(double factor) {Vector obj;Vector::Mode mode = this->currentMode;this->set2RECT();obj = Vector(this->xLen * factor, this->yLen * factor, Vector::RECT);obj.currentMode = mode;return obj;}Vector Vector::operator*=(double factor) {return operator*(factor);}Vector operator*(double factor, Vector &obj) {return obj * factor;}Vector operator*=(double factor, Vector &obj) {return operator*(factor, obj);}Vector Vector::operator-() {Mode mode = this->currentMode;this->set2RECT();Vector v = Vector(-this->xLen, -this->yLen, Vector::RECT);v.currentMode = mode;return v;}std::ostream &operator<<(std::ostream &os, Vector &obj) {std::ios_base::fmtflags pref;std::streamsize preC;pref = os.setf(std::ios_base::fixed);  // store prevpreC = os.precision(1); // store prevos << "Vector:(" << obj.xLen << " , " << obj.yLen << ")|[RECT]\t";os.precision(2);os << "Vector:(" << obj.angle << " , " << obj.length << ")|[POL]\t";if (obj.currentMode == Vector::RECT) {os << "{RECT}\n";} else {os << "\t{POL}\n";}os.setf(pref);  // resetos.precision(preC); // resetreturn os;}}
#include <iostream>
#include <sstream>
#include <random>
#include <stdlib.h>
#include "Vector.h"void end();void resetCin();void executeFromUser();void execute(double length, double step);void executeTimes(unsigned int times);const unsigned int MAX_FREE = 10;bool USER_INPUT = false; // 是否每次都让用户输入static int usedTimes = 0;static int currentSteps = 0;int main() {using namespace std;using VECTOR::Vector;Vector v1 = Vector(20, 30, Vector::RECT);Vector v2 = Vector(40, 50, Vector::RECT);v1 += v2;cout << v1 << endl;//    executeFromUser();executeTimes(100);return 0;
}void executeTimes(unsigned int times) {using namespace std;using VECTOR::Vector;cout << "随机漫步模拟.\n";double avg = 0;double length; // 总位移double eachLen;// 单步长度string input;stringstream ostr;cout << "请输入总位移长度(退出请按q):";getline(cin, input);ostr << input;while (1) {if (ostr >> length) {cout << "length==" << length;ostr.clear();cout << "请输入单步位移长度(退出请按q):";getline(cin, input);ostr << input;if (ostr >> eachLen) {cout << "todo: SUCCESS\n";for (int pos = 0; pos < times; ++pos) {execute(length, eachLen);avg += currentSteps;}goto fuck;} else {cout << "输入不合法, 请重新输入!\n";}} else {cout << "输入不合法, 请重新输入!\n";}}fuck:;avg = avg / times;streamsize precision = cout.precision(2);cout << "随机漫步目标位移为" << length << "时的平均步数为:" << avg << "\n";cout.precision(precision);
}void execute(double length, double step) {using namespace std;using VECTOR::Vector;Vector init{};
//    cout << "init.Length=" << init.getLength() << " , length=" << length << endl;while (init.getLength() < length) {currentSteps++;double angle = random() % 360;double el = step;Vector each = Vector(angle, el);
//                    cout << "........each:" << each;init += each;}streamsize precision = cout.precision(2);cout << "RESULT:" << init;cout << "这一次走完目标距离(" << length << ")一共用了[" << currentSteps << "]步,";cout << "目前距离长度为:" << init.getLength() << " > 目标长度:" << length << endl;usedTimes++;cout << "还有(" << (MAX_FREE - usedTimes) << ")次机会\n";cout.precision(precision);
}void executeFromUser() {using namespace std;using VECTOR::Vector;cout << "随机漫步模拟.\n";double length; // 总位移double eachLen;// 单步长度string input;stringstream ostr;while (usedTimes <= MAX_FREE) {cout << "请输入总位移长度(退出请按q):";getline(cin, input);ostr << input;if (ostr >> length) {cout << "length==" << length;ostr.clear();cout << "请输入单步位移长度(退出请按q):";getline(cin, input);ostr << input;if (ostr >> eachLen) {cout << "todo: SUCCESS\n";execute(length, eachLen);if (!USER_INPUT) {goto fuck;}} else {cout << "输入不合法, 请重新输入!\n";}} else {cout << "输入不合法, 请重新输入!\n";}}if (usedTimes > MAX_FREE) {cout << "体验机会已经用光,继续体验请充值~^_^\n";}end();fuck:;
}void end() {resetCin();std::cout << "Bye.\n";
}void resetCin() {std::cin.clear();while (std::cin.get() != '\n')continue;
}

完整的项目可以参见:随机漫步关系模型cpp实现

当然,这个代码写得不好,没有去优化内存。

可以看一下输出效果:

随机漫步模拟.
请输入总位移长度(退出请按q):100
请输入单步位移长度(退出请按q):1
随机漫步目标位移为100.00时的平均步数为:497246.73

从输出结果可以看到,通过1000次的模拟,得出的平均数是49万步,才能前进100米。(假设步长是固定的,为1米)。

ps: 这个结果也不一定正确,说不定程序逻辑有问题。~

cpp: 随机漫步者的位移与步数的关系模型实现相关推荐

  1. ML之SVM:随机产生100个点,建立SVM模型,找出超平面方程

    ML之SVM:随机产生100个点,建立SVM模型,找出超平面方程 目录 实现结果 代码实例 实现结果 代码实例 import numpy as np import pylab as pl from s ...

  2. 机器学习项目实战:基于随机森林进行心脏病分类(含多种模型解释方法)

      本项目是Kaggle上面的一个经典竞赛题,心脏病分类问题,题目链接在这里. 主要基于随机森林的bagging集成学习框架,通过13个生理特征数据,实现对心脏病分类的预测.   由于自己想要在这个项 ...

  3. 机器学习笔记 十五:随机森林(Random Forest)评估机器学习模型的特征重要性

    随机森林 1. 随机森林介绍 1.1 租赁数据案例 2. 特征相关性分析(热图) 2.1 热图绘制 2.2 构建随机森林模型 2.3 不同特征合并的重要性 2.3.1 经纬度合并(分3类) 2.3.2 ...

  4. 加速度,速度,位移和时间的关系

    初速度为0时的基本公式:S:位移:a:加速度:t 时间: v:速度 S=½ a t² (物体从0开始,加速运动,到t时刻所运行的距离) v=at ( 物体从0开始,加速运动,到t时刻所达到的速度) 初 ...

  5. CAD 随机卵石混凝土 混凝土细观 卵石混凝土模型

    实现思路 采用泰森多边形控制区的方案,实现卵石模型的构建.实现思路如下: 1.采用蒙特卡洛方法散布控制点: 2.以控制点构建Voronoi图: 3.计算Voronoi图的厚度边界: 4.采用曲线拟合绘 ...

  6. 基于Python的随机森林(RF)回归与多种模型超参数自动优化方法

      本文详细介绍基于Python的随机森林(Random Forest)回归算法代码与模型超参数(包括决策树个数与最大深度.最小分离样本数.最小叶子节点样本数.最大分离特征数等等)自动优化代码.    ...

  7. [sklearn]决策树、随机森林、隐马尔可夫模型

    决策树 决策树(Decision Tree)是一种用于处理分类和回归问题的无监督学习算法.如下图所示为某女青年在某相亲网站的相亲决策图.这幅图描述的都是一个非常典型的决策树模型. 通过对其相亲决策的分 ...

  8. etc的常见算法_运用机器学习算法研究城市形态与户外温度之间的相关性

    随着城市化进程以及气候变化的加剧,城市正经历着频率更高.强度更大.持续时间更长的热浪天气.目前学者提出许多研究不同尺度气候问题的方法,其中最常用的是参数回归方法,如最小二乘法回归模型(OLS,ordi ...

  9. 随机系统(stochastic systems)——以随机游走为例

    目录 文章目录 一杯咖啡是随机的吗? 随机游走与扩散 扩散定律是普适的 摩擦与扩散是一对双胞胎--爱因斯坦关系 爱因斯坦关系溯源--涨落耗散定理 一杯咖啡是随机的吗? 生活中有许多例子是牛顿力学基本能 ...

最新文章

  1. 混合云存储跨云灾备方案之跨云容灾
  2. LeetCode: 106. Construct Binary Tree from Inorder and Postorder Traversal
  3. 在Python中实现SVM分类
  4. 【fjwc2015】世界树
  5. 浅谈Linux中的信号处理机制(三)
  6. 淘淘商城项目分析报告
  7. mixamo网站_超全面的素材网站推荐
  8. mysql mvcc 隔离级别_关于 Mysql 四种隔离级别中 Lock 和 MVCC 的关系
  9. 训练日志 2019.4.7
  10. 从原理到实践,手把手带你轻松get数仓双集群容灾
  11. iphone分屏功能怎么用_iPhone终于上线这功能,可惜安卓都用烂了
  12. 使用Castle做类的增强
  13. LeetCode解题思路—滑动窗口法
  14. pragma预处理指令详解
  15. MyBatis实现修改数据
  16. NLTK09《Python自然语言处理》code08 分析句子结构
  17. 【运筹学】线性规划数学模型 ( 求解基矩阵示例 | 矩阵的可逆性 | 线性规划表示为 基矩阵 基向量 非基矩阵 非基向量 形式 )
  18. java mail 踩坑 >>> 批量读取附件,附件重复
  19. NVIDIA Jetson TK1学习与开发——手动刷机
  20. 腾讯副总裁曾宇:谈谈腾讯的技术价值观与技术人才修炼

热门文章

  1. anaconda3中环境管理
  2. C#写的控制三菱FX5U PLC(三菱任何系列都通用,网口,串口都行)的上位机程序
  3. 低阶有限群的伽罗瓦表示
  4. 使用shiro标签遇到的坑
  5. MasterAlign八相机非映射贴合对位系统调试说明书
  6. HDFS的主要设计理念
  7. 华为-BGP-路由技术
  8. Nature雄文指引绿色金融研究-内附丰富低碳数据
  9. CoralSwap或将成为OKExChain上的下一个爆款?
  10. 2020年加密货币领域的5大做市商,都有谁?