算法设计与分析:随机化算法(作业-必做)(头歌实验)

news2024/9/28 13:25:40

第1关:硬币实验

任务描述

本关任务:计算机产生的伪随机数来模拟抛硬币试验。

相关知识

为了完成本关任务,你需要掌握:1.如何获取数组的长度,2.如何遍历数组。

随机数

随机数在随机化算法设计中扮演着十分重要的角色。 在现实计算机上无法产生真正的随机数,因此在随机化算法中使用的随机数都是一定程度上随机的,即伪随机数。

用计算机产生的伪随机数来模拟抛硬币试验。 假设抛10次硬币,每次抛硬币得到正面和反面是随机的。拋10次硬币构成一个事件。 调用Random(2)返回一个二值结果。 在主程序中反复调用函数TossCoins模拟拋10次硬币这一事件50000次。 用head[i](0<=i<=10)记录这50000次模拟恰好得到i次正面的刺手。最终输出模拟抛硬币事件得到的正面事件的概率图。

编程要求

根据提示,在右侧编辑器补充代码。

测试说明

RandomNumber.h 函数已经写好,可以点击查看。

平台会对你编写的代码进行测试: 例如: 输入: 10 50000 输出:

 
  1. 0 *
  2. 1 *
  3. 2 *
  4. 3 *
  5. 4 *
  6. 5 *
  7. 6 *
  8. 7 *
  9. 8 *
  10. 9 *
  11. 10 *`

开始你的任务吧,祝你成功!

参考答案:

#include "RandomNumber.h"
#include <iostream>
using namespace std;
int TossCoins(int numberCoins);
int main()
{
    //模拟随机抛硬币事件
    int NCOINS;
    long NTOSSES;
    cin >>NCOINS;
    cin >>NTOSSES;
    //heads[i]是得到i次正面的次数
    long i,heads[NCOINS+1];
    int j,position;
    //初始化数组heads
    for(int j=0; j<NCOINS+1;j++)
    {
        heads[j] = 0;
    }
    //重复50,000次模拟事件
    for(int i=0; i<NTOSSES; i++)
    {
        heads[TossCoins(NCOINS)]++;
    }
    //输出频率图
    for(int i=0; i<=NCOINS; i++)
    {
        position = int(float(heads[i])/NTOSSES*72);
        cout<<i<<" ";
        for(int j=0; j<position-1; j++)
        {
            cout<<" ";
        }
        cout<<"*"<<endl;
    }
    return 0;
}
int TossCoins(int numberCoins)
{
    //随机抛硬币
    static RandomNumber coinToss(1);
    int i,tosses = 0;
    for(int i=0; i<numberCoins; i++)
    {
        //Random(2) = 1表示正面
        tosses += coinToss.Random(2);
    }
    return tosses;
}

第2关:用随机投点法求圆周率

任务描述

本关任务:编写一个程序,利用随机投点法计算圆周率

相关知识

设有一半径为r的圆及其外切四边形。向该正方形随机地投掷n个点。设落入圆内的点数为k。由于所投入的点在正方形上均匀分布,因而所投入的点落入圆内的概率为:

所以当n足够大时,k与n之比就逼近这一概率,从而

编程要求

根据提示,在右侧编辑器补充代码。

测试说明

平台会对你编写的代码进行测试:

输入:

100

输出:

n1=100 pi=3.12

开始你的任务吧,祝你成功!

参考答案:

//随机化算法 用随机投点法计算π值
#include "RandomNumber.h"
#include <iostream>
using namespace std;
 
double Darts(int n);
 
int main()
{
	int n1;
    cin>> n1;
    cout<<"n1="<<n1<<"\npi="<<Darts(n1)<<endl;
	return 0;
}
 
//用随机投点法计算π值
double Darts(int n)
{	
	static RandomNumber dart(1);
   /*************begin****************/
   int k=0;
   for(int i=1;i<=n;i++){
       double x=dart.fRandom();
       double y=dart.fRandom();
       if((x*x+y*y)<=1){
           k++;
       }
   }
   return 4*k/double(n);
   
   /***************end****************/
}

第3关:解非线性方程组

任务描述

本关任务:编写程序求线性方程组。

相关知识

求解下面的非线性方程组

其中,x1,x2,…,xn是实变量,fi是未知量x1,x2,…,xn的非线性实函数。 要求确定上述方程组在指定求根范围内的一组解 。

解决这类问题有多种数值方法,如:牛顿法、拟牛顿法、粒子群算法等。最常用的有线性化方法和求函数极小值方法。为了求解所给的非线性方程组,构造一目标函数

式中,x=(x1,x2,……xn)。易知,上式取得极小值点即是所求非线性方程组的一组解。

编程要求

求一个简单的二维线性方程组: x1-x2=fx1 x1+x2=fx2 根据提示,在右侧编辑器补充代码。

测试说明

平台会对你编写的代码进行测试: 例如: 输入: 1 3 输出: The original equations are: x1-x2=1 x1+x2=3 The roots are: x1=2.02104 x2=1.01445 开始你的任务吧,祝你成功!

参考代码:

//随机化算法 解线性方程组
#include "RandomNumber.h"
#include <iostream>
using namespace std;
 
bool NonLinear(double *x0,double *dx0,double *x,double *fx,double a0,
					double epsilon,double k,int n,int Steps,int M);
double f(double *x,double *fx);
 
int main()
{
	double  *x0,				//根初值
			*x,					//根
			*dx0,			//增量初值
			*fx,  // 函数值
			a0 = 0.0001,			//步长
			epsilon = 0.01,		//精度
			k = 1.1;			//步长变参
	int n = 2,					//方程个数
		Steps = 10000,			//执行次数
		M = 1000;				//失败次数
 
	x0 = new double[n+1];
	dx0 = new double[n+1];
	x = new double[n+1];
	fx = new double[n+1];
	
	cin >> fx[1];
	cin >> fx[2];
	
	//根初值
	x0[1] = 0.0;
	x0[2] = 0.0;
 
	//增量初值
	dx0[1] = 0.01;
	dx0[2] = 0.01;
 
	cout<<"The original equations are:"<<endl;
	cout<<"x1-x2="<<fx[1]<<endl;
	cout<<"x1+x2="<<fx[2]<<endl;
 
	cout<<"The roots are:"<<endl;
 
	bool flag = NonLinear(x0,dx0,x,fx,a0,epsilon,k,n,Steps,M);
	while(!flag)
	{		
		flag = NonLinear(x0,dx0,x,fx,a0,epsilon,k,n,Steps,M);
	}	
	for(int i=1; i<=n; i++)
	{
		cout<<"x"<<i<<"="<<x[i]<<" ";
	}
	cout<<endl;
 
	return 0;
}
 
//解非线性方程组的随机化算法
bool NonLinear(double *x0,double *dx0,double *x,double *fx,double a0,
					double epsilon,double k,int n,int Steps,int M)
{
	static RandomNumber rnd(1);
	bool success;			//搜索成功标志
	double *dx,*r;
 
	dx = new double[n+1];	//步进增量向量
	r = new double[n+1];	//搜索方向向量
	int mm = 0;				//当前搜索失败次数
	int j = 0;				//迭代次数
	double a = a0;			//步长因子
 
	for(int i=1; i<=n; i++)
	{
		x[i] = x0[i];
		dx[i] = dx0[i];
	}
 
	double fy = f(x,fx);		//计算目标函数值
	double min = fy;		//当前最优值
 
	while(j<Steps)
	{
		//(1)计算随机搜索步长
	/***********begin**************/
	if(fy<min){
        min=fy;
        a*=k;
        success=true;
    }
    else{
        mm++;
        if(mm>M){
            a/=k;
        }
        success=false;
    }
    if(min<epsilon){
        break;
    }
	/************end***************/
		//(2)计算随机搜索方向和增量
	/***********begin**************/
	for(int i=1;i<=n;i++){
        r[i]=2.0*rnd.fRandom()-1;
    }
    if(success){
        for(int i=1;i<=n;i++){
            dx[i]=a*r[i];
        }
    }
    else {
        for(int i=1;i<=n;i++){
            dx[i]=a*r[i]-dx[i];
        }
    }
	/************end***************/
 
		//(3)计算随机搜索点
	/***********begin**************/
	for(int i=1;i<=n;i++){
        x[i]+=dx[i];
    }
	/************end***************/
 
		//(4)计算目标函数值
	/***********begin**************/
	fy=f(x,fx);
    j++;
	/************end***************/
	}	
 
	if(fy<=epsilon)
	{
		return true;
	}
	else
	{
		return false;
	}
}
 
double f(double *x, double* fx)
{
	/***********begin**************/
	return (x[1]-x[2]-fx[1])*(x[1]-x[2]-fx[1])
            +(x[1]+x[2]-fx[2])*(x[1]+x[2]-fx[2]);
	/************end***************/
}

如果对你有所帮助,感谢点赞加收藏!

关于接下来的实验内容,我也会在【WRITE-BUG数字空间】更新,也可以为大家带来更好的观感,带来更多的分享,欢迎大家前来浏览。

算法设计与分析:随机化算法(作业-必做)(头歌实验) -文章频道 - 我的学习圈 - 个人学习圈 (writebug.com)icon-default.png?t=N3I4https://www.writebug.com/article/8c2ca050-f3e6-11ed-a099-0242ac14000d

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/546470.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云原生CAx软件:gRPC

gRPC是Google基于HTTP/2协议开发的一套开源、跨平台的高性能RPC框架&#xff0c;可用于连接微服务架构内的各种服务&#xff0c;亦可以连接客户端与后端服务。 Ref. from gRPC gRPC is a modern open source high performance Remote Procedure Call (RPC) framework that can…

策划能力提升攻略:让你成为行业大咖

策划能力的提高是没有立竿见影的&#xff0c;首先你了解策划的本质吗?了解市场营销的本质吗?了解战略和策略的关系吗? 不是经常把什么IMC/USP/4P/4C/DNA/核心价值挂在嘴边&#xff0c;会做做波特SWOT分析、用用BCG的模型、MINKSY的7S模型这些就是策划了的。 别人的理论你可…

WEB AK赛

文章目录 web1_观字SSRF常见的URL绕过方式 web2_观星web3_观图web4_观心签到_观己 web1_观字 <?php#flag in http://192.168.7.68/flag if(isset($_GET[url])){$url $_GET[url];$protocol substr($url, 0,7);if($protocol!http://){die(仅限http协议访问);}if(preg_matc…

安装Maven 3.6.1:图文详细教程(适用于Windows系统)

一、官网下载对应版本 推荐使用maven3.6.1版本&#xff0c;对应下载链接&#xff1a; Maven3.6.1下载地址 或者&#xff0c;这里提供csdn下载地址&#xff0c;点击下载即可&#xff1a; Maven3.6.1直链下载 其他版本下载地址&#xff1a; 进入网址&#xff1a;http://mave…

【Linux之IO系统编程学习】01.open函数使用 代码实现touch命令效果

【Linux之IO系统编程学习】 项目代码获取&#xff1a;https://gitee.com/chenshao777/linux_-io.git &#xff08;麻烦点个免费的Star哦&#xff0c;您的Star就是我的写作动力&#xff01;&#xff09; 01.open函数使用 & 代码实现touch命令 一、open函数&#xff08;ma…

ARM处理器概论与组织

目录 1.ARM产品系列 2.体系结构 3.ARM指令集 定义&#xff1a; ARM的指令集&#xff1a; 4.编译原理 5.ARM存储模型 6.ARM的8种工作方式 ARM&#xff08;Advanced RISC Machines&#xff09;有三种含义 一个公司的名称、一类处理器的通称、一种技术&#xff0c;我们在这…

【中阳期货】人工智能AI与期货有什么 关系

人工智能&#xff08;AI&#xff09;和期货交易之间有许多相互影响的因素。AI可以帮助期货交易者在交易决策中更好地应对大量数据&#xff0c;加强交易系统预测能力&#xff0c;优化资产配置策略。以下是AI与期货交易的一些具体关系&#xff1a; 数据分析&#xff1a;AI有能力高…

python pickle反序列化分析

文章目录 前言Pickle的作用pickle反序列化pickletools和反序列化流程漏洞产生(__reduce__)R指令的绕过通过i和o指令触发 总结 前言 春秋杯中遇到了一道python题&#xff0c;使用的了numpy.loads()触发反序列化漏洞&#xff0c;百度学习了一下&#xff0c;发现numpy.load()会先…

【mysqlbinlog 恢复数据】

不小心把数据删掉了 首先要拿到binlog文件 命令行执行 /usr/local/mysql/bin/mysqlbinlog --base64-outputdecode-rows --start-datetime"2023-05-19 09:01:32" --stop-datetime"2023-05-19 09:01:35" -v /Users/zylong/Downloads/mysql-bin.003178 --re…

动态规划-状态机模型

大盗阿福 题目 链接&#xff1a;https://www.acwing.com/problem/content/1051/ 阿福是一名经验丰富的大盗。趁着月黑风高&#xff0c;阿福打算今晚洗劫一条街上的店铺。 这条街上一共有 N N N 家店铺&#xff0c;每家店中都有一些现金。 阿福事先调查得知&#xff0c;只…

chatgpt赋能Python-python3_9怎么下载

Python 3.9: 从哪里下载以及如何安装 Python是一种高级编程语言&#xff0c;被广泛使用于数据科学、人工智能、Web开发等领域。Python的最新版本是Python 3.9&#xff0c;它带来了一些新的特性和改进。对于那些希望尝试Python 3.9的人来说&#xff0c;了解如何下载和安装是很重…

chatgpt赋能Python-python3下载文件

Python3下载文件&#xff1a;从入门到实践 在Python编程语言中&#xff0c;下载文件是一个常见的需求。无论你是想下载图片、视频、文本文件或者其他类型的文件&#xff0c;Python都提供了强大的工具来实现这一操作。在本文中&#xff0c;我们将深入探讨如何使用Python3来下载…

pwn入门(二)环境搭建

一.前言 在上一篇中介绍了一下pwn和一些前置知识&#xff0c;但是呢以我的感觉&#xff0c;我觉得ctf还是得多做题的&#xff0c;所以呢&#xff0c;我选择边做边学&#xff0c;我觉得这样可以快速熟悉pwn还可以有成就感。 这一篇就是搭建环境的分享&#xff0c;同时还有大佬告…

【问题记录】USB monitor抓包工具显示音频数据CRC error

一&#xff0c;简介 在进行UAC2.0调试的过程中&#xff0c;使用USB monitor抓包工具抓取音频流数据出现数据错乱现象&#xff0c;本文对该问题进行分析记录。 二&#xff0c;问题记录及分析过程 2.1 先看下正常的抓包数据是什么样子&#xff1a; 从上图可以看出&#xff0c;…

VMware ESXi 6.0 多网卡接入 多网段绑定 虚机接入不同网段

网卡要与对应网段的网络联通。不同的网卡接入不同网段的网络。要为vmware esxi 6 的多个虚机配置不同网段的ip地址&#xff0c;首先选择主机对应的网口分别插上处于在不同网段的网线。 配置管理网络 多个网口接入&#xff0c;只可以配置一个管理网络&#xff0c;就是只有一个网…

基于XGBOOST模型预测货物运输耗时 - Part 2 通过方差分析了解文本型变量与数值型目标变量的关系

在分析数据之前&#xff0c;我们需要剔除异常值的影响&#xff0c;也就是在某个分组情况下&#xff0c;标准差过大&#xff08;标准差越大&#xff0c;证明情况越不稳定&#xff09;&#xff0c;如果标准差比较小&#xff0c;就算是最小值和最大值差的比较大&#xff0c;我也认…

chatgpt赋能Python-python3下载numpy包

Python3 下载numpy包教程 如果你是一名Python开发者&#xff0c;那你一定不会陌生于NumPy。NumPy是Python中的一个科学计算库&#xff0c;它主要用来处理数组和矩阵运算。本文将会教你如何在Python3中下载NumPy库。 步骤一&#xff1a;确认你已经安装了pip 如果你使用的是Py…

chatgpt赋能Python-python3__2__3

Python323 - 一个强大的编程工具 介绍 Python323 是一种高级编程语言&#xff0c;最初由 Guido van Rossum 在 1989 年创建。Python 3.2.3 是 Python 3 的其中一个发行版&#xff0c;它拥有很多新特性和改进。Python323 可以运行在多种操作系统上&#xff0c;包括 Windows、L…

redis哨兵监控leader和master选举原理

当一个主从配置中的master失效后&#xff0c;sentinel可以选举出一个新的master,用于自动接替原master的工作&#xff0c;主从配置中的其他redis服务器自动指向新的master同步数据。是如何具体做的呢&#xff0c;主要有以下4步。 一般建议sentinel 采取奇数台. 1.SDown 主观下…

Day43【动态规划】1049.最后一块石头的重量 II、494.目标和、474.一和零

1049.最后一块石头的重量 II 力扣题目链接/文章讲解 视频讲解 还是需要转化为 0-1 背包问题&#xff1a;物品装入背包&#xff0c;求装入的最大价值&#xff08;每个物品至多装入一次&#xff09; 要把01背包问题套到本题上来&#xff0c;需要确定 背包容量物品价值物品重…