头歌计算机算法设计与分析:随机化算法

news2024/11/14 17:36:17

第1关:硬币实验

任务描述
相关知识
    随机数
编程要求
测试说明

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

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

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

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

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

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

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

    0 *
    1 *
    2   *
    3        *
    4              *
    5                 *
    6              *
    7        *
    8   *
    9 *
    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关:用随机投点法求圆周率

    任务描述
    相关知识
    编程要求
    测试说明

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

相关知识
在这里插入图片描述
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试:
输入:

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);
    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);
}

第3关:解非线性方程组

任务描述
相关知识
编程要求
测试说明

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

相关知识
求解下面的非线性方程组
在这里插入图片描述
在这里插入图片描述
编程要求
求一个简单的二维线性方程组:
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)计算随机搜索步长
        if(fy<min)//搜索成功
        {
            min = fy;
            a *= k;
            success = true;
        }
        else//搜索失败
        {
            mm++;
            if(mm>M)
            {
                a /= k;
            }
            success = false;
        }
        if(min<epsilon)
        {
            break;
        }
        //(2)计算随机搜索方向和增量
        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];
            }
        }
        //(3)计算随机搜索点
        for(int i=1; i<=n; i++)
        {
            x[i] += dx[i];
        }
        //(4)计算目标函数值
        fy = f(x,fx);
        j++;
    }    
    if(fy<=epsilon)
    {
        return true;
    }
    else
    {
        return false;
    }
}
double f(double *x, double* fx)
{
    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]);
}

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

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

相关文章

基于 SpringBoot+WebSocket 无DB实现在线聊天室

0 项目说明 0.1 样例展示 0.2 源码地址 GitHub&#xff1a;https://github.com/ShiJieCloud/web-chat Gitee&#xff1a;https://gitee.com/suitbaby/web-chat GitCode&#xff1a;I’m Jie / web-chat GitCode 1 WebSocket 简介 1.1 HTTP 常用的 HTTP 协议是一种无状态…

【牛客刷题专栏】0x27:JZ29 顺时针打印矩阵(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转)&#xff0c;它登陆后会保存刷题记录进度&#xff0c;重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏&#xff1a;个人CSDN牛客刷题专栏。 题目来自&#xff1a;牛客/题库 / 在线编程 / 剑指offer&#xff1a; 目录 前言问…

2023年Pycharm安装教程,附详细图解

简介 PyCharm是一款Python IDE&#xff0c;其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如&#xff0c; 调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等等。此外&#xff0c;该IDE提供了一些高级功能&a…

面向对象构造顺序与析构顺序详解

#include<bits/stdc.h> using namespace std;class animal{public:animal(){cout<<"调用animal构造"<<endl;}~animal(){cout<<"调用animal析构"<<endl;} };class verhical{public:verhical(){cout<<"调用verhica…

服装供应链管理包含哪些内容,如何选择服装供应链管理系统?

服装供应链管理是指对服装工厂的采购、生产、物流、仓储和销售等环节的管理&#xff0c;包括原材料的采购、成品的制造、配送、零售等多个环节。 选择合适的服装供应链管理系统&#xff0c;能够帮助服装工厂提高供应链管理的效率、优化库存管理、降低运营成本、保证服装生产的品…

TCP协议三次握手四次挥手详细分析

在学习TCP协议的时候&#xff0c;接触最多的就是TCP的三次握手和四次挥手。关于这个的介绍大多数都是文字和图示来分析的&#xff0c;但是具体到协议的内容时&#xff0c;有可能还是不清楚&#xff0c;下面我就通过具体协议来分析一下这个过程。 这里使用Wireshark网络分析工具…

【Linux】进程与文件系统(上)

由于这部分的知识很多很多&#xff0c;分成两回 目录 1.文件描述符 文件描述符 1.文件描述符 首先我们看一下几个小问题 1.你真的理解文件原理和操作了吗&#xff1f; 这不是语言的问题&#xff0c;而是操作系统的问题 2.是不是只有C/C有文件操作&#xff1f; 其他语…

【数据结构】结构最复杂实现最简单的双向带头循环链表

【数据结构】结构最复杂实现最简单的双向带头循环链表 一、前言二、目标三、实现1、初始化工作2、尾插2.1、图解思路2.2、代码实现 3、尾删3.1、图解思路3.2、代码实现 4、打印链表5、头插5.1、图解思路5.2、代码实现 6、头删6.1、图解思路6.2、代码实现 7、查找8、随机插入8.1…

数据结构与算法基础(青岛大学-王卓)(2)

第二弹火爆来袭中 这波是单链表的内容整理&#xff0c;废话不多说&#xff0c;上小龙虾呀(又到了龙虾季节了&#xff0c;哎&#xff0c;口水直流了~~) beautiful的分割线 文章目录 第二弹火爆来袭中这波是单链表的内容整理&#xff0c;废话不多说&#xff0c;上小龙虾呀(又到了…

【致敬未来的攻城狮计划】— 连续打卡第二十七天:瑞萨RA RA2E1 的 BTN触摸按键

文章目录 由于一些特殊原因&#xff1a; 系列文章链接&#xff1a;&#xff08;其他系列文章&#xff0c;请点击链接&#xff0c;可以跳转到其他系列文章&#xff09;或者参考我的专栏“ 瑞萨MCU ”&#xff0c;里面是 瑞萨RA2E1 系列文章。 24.RA2E1的 DMAC——数据传输 25.R…

DB2_sql_问题

db2新增字段指定顺序 这个是不能做到的&#xff0c;除非把表删除重新创建的&#xff01; 原理是这样子的&#xff1a;当你创建表时系统会记录下你的SEQ-ID,就是字段的顺序号&#xff0c;这个是根据字段先后顺序来生成的&#xff0c;系统默认显示的时候也是根据这个来的&#x…

linux:工具(命令)vi、vim文本编辑器详解。

linux:工具(命令)vi/vim文本编辑器详解。 因此&#xff0c;本质上vi和vim是同种东西&#xff0c;后面也会合起来说&#xff0c;但是使用上会使用vim&#xff0c;因为vim是加强版。 使用形式&#xff1a; 无论退出还是进入都需要去到 “命令模式”。 当使用vi/vim时就会进入“命…

「高性能MySQL」读书笔记(1)- MySQL架构

一、前言 本系列主要是记录阅读「高性能MySQL」期间笔记&#xff0c;记录在日常使用中忽略的知识、模糊的点&#xff0c;主要面对有一定MySQL使用经验的开发者。 本文是针对于MySQL一些基础定义的解释说明&#xff0c;会非常浅显通俗易懂。 二、MySQL的逻辑架构 简单梳理My…

PCL学习九:Registration-配准

参考引用 Point Cloud Library黑马机器人 | PCL-3D点云 1. 点云中的数学 函数求导 对于函数 f ( x ) x 2 f(x)x^2 f(x)x2 其一阶导数也是 x x x 的函数&#xff1a; d f d x 2 x \frac{df}{dx}2x dxdf​2x其二阶导为常数&#xff0c;与 x x x 无关&#xff1a; d 2 f d x…

【漏洞分析】CVE-2021-0920 Linux内核垃圾回收机制中的竞争UAF漏洞

漏洞发现&#xff1a;该漏洞早在2016年被 RedHat 内核开发人员发现并披露&#xff0c;但 Linux 内核社区直到 2021 年重新报告后才对该漏洞进行修补&#xff08;patch&#xff09;。Google的威胁分析小组&#xff08;Threat Analysis Group&#xff09;发现该漏洞在野外被使用&…

shell脚本----基础命令

文章目录 一、sort命令二、uniq命令三、 tr命令四、cut命令 一、sort命令 sort命令以行为单位对文件内容进行排序&#xff0c;也可以根据不同的数据类型来排序&#xff0c;比较的原则是从首字符向后&#xff0c;一次按ASCII码的值进行比较&#xff0c;最后按序输出。 ASCII码…

【P17】JMeter 边界提取器(Boundary Extractor)

文章目录 一、准备工作二、测试计划设计 一、准备工作 慕慕生鲜&#xff1a; http://111.231.103.117/#/login 进入网页后&#xff0c;登录&#xff0c;页面提供了账户和密码 搜索框输入“虾” 右键检查或按F12&#xff0c;打开调试工具&#xff0c;点击搜索 二、测试计划设…

详细版易学版TypeScript - 元组 枚举

一、元组(Tuple) 数组:合并了相同类型的对象 const myArr: Array<number> [1, 2, 3]; 元组(Tuple):合并了不同类型的对象 // 定义元组时就要确定好数据的类型&#xff0c;并一一对应 const tuple: [number, string] [12, "hi"]; // 添加内容时&#xff0c;不…

SQLIST数据库编程

目录 数据库简介 1.常用数据库 2. SQLite基础 3.创建SQLite数据库 虚拟中sqlite3安装 基础SQL语句使用 sqlite3编程 数据库简介 1.常用数据库 大型数据库 &#xff1a;Oracle 中型数据库 &#xff1a;Server是微软开发的数据库产品&#xff0c;主要支持windows平台 小型数据库…

( 位运算 ) 190. 颠倒二进制位 ——【Leetcode每日一题】

❓190. 颠倒二进制位 难度&#xff1a;简单 颠倒给定的 32 位无符号整数的二进制位。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;如 Java&#xff09;中&#xff0c;没有无符号整数类型。在这种情况下&#xff0c;输入和输出都将被指定为有符号整数类型&a…