算法:给出指定整数区间、期望值,得到最终结果

news2024/10/6 10:33:06

1,问题: 

在游戏中,我们经常会遇到以下情况:打开宝箱,获得x个卡牌碎片。

  但通常策划只会给一个既定的数值空间,和一个期望得到的值,然后让我们去随机。比如:

  问题A:在1~3之间的整数中随机,期望随机结果的平均值是1.175,如何实现?
  延伸:1~10之间,期望平均值是5.4呢?
  以上问题可以归纳为:m~n之间,期望值是q,求出最终结果。

  首先,我们可以问下AI,如何实现这个算法。以下是AI给出结果的截图:

  这种按照多元方程求解的方法,需要自己去随机给定概率,当然可以实现。但有没有更直接的方法呢?

2,求解过程:

  经过思考,我们可以用补偿算法的方式,来得到这个既定结果。这里需要引入一个补偿数的概念,补偿数由每次随机结果的偏差值累加而成。

  因为每次随机事件是独立的,我们引入问题A,得到如下随机结果:

第1次随机区间1~3,随机结果1,补偿数为 0.175 ;

第二次随机区间2~3,随机结果2,补偿数为-0.65;

第3次随机区间1~2,随机结果1,补偿数为-0.475,小于精度0.5,取随机数组结束。

随机数组为1,2,1;在其中随机取1位便是结果。

  我们可以验算下:(1+2+1)/3~=1.333,与1.175偏差小于0.5。代码编译:

  然后我们将以上思考过程改为函数如下:

 //获取所有的随机范围
    void GetAllRandom(float _expect, int _min, int _max, float _precision)
    {
        var _getList = new List<int>();
        GetRandomOnce(_getList, 0, 0f, _expect, _min, _max, _precision);


        var _f = 0f;
        var _str = "";
        foreach (var idx in _getList)
        {
            _f += idx;
            _str += idx + ",";
        }
        Debug.LogError("得到结果数组:" + _str + "\n平均值:" + (_f / _getList.Count));

        Debug.LogError("最终结果:" + _getList[Random.Range(0, _getList.Count)]);
    }



    /// <summary>
    /// 取到的随机数 数组
    /// </summary>
    /// <param name="_list">取值数组</param>
    /// <param name="_ranNum">随机次数</param>
    /// <param name="_compensate">补偿值:累加</param>
    /// <param name="_expect">期望值</param>
    /// <param name="_min">最小值</param>
    /// <param name="_max">最大值</param>
    /// <param name="_precision">精确度</param>
    /// 约束条件:
    /// 1,随机次数>n次,比如1~10之间随机,随机次数需要>10
    /// 2,最终补偿数需要误差小于1(精确度)   
    private void GetRandomOnce(List<int> _list, int _ranNum, float _compensate, float _expect, int _min, int _max, float _precision)
    {
        //根据补偿数重新定义范围
        int _ran = 0;
        if (_compensate > 0f)
        {
            var _tMin = Mathf.Min(_max, Mathf.CeilToInt(_min + _compensate));
            _ran = Random.Range(_tMin, _max + 1);
            Debug.Log(_tMin + "   " + _ran + "  " + _max);

        }
        else
        {
            var _tMax = Mathf.Max(_min, Mathf.FloorToInt(_max + _compensate));
            _ran = Random.Range(_min, _tMax + 1);
            Debug.Log(_min + "  " + _ran + "   " + _tMax);
        }
        _compensate += _expect - _ran;
        _ranNum++;
        Debug.LogError(_ran + "   " + _compensate+"   "+_ranNum);
        _list.Add(_ran);
        if (_ranNum > (_max - _min + 1) && Mathf.Abs(_compensate) < _precision) return;//满足约束条件

        if (_ranNum > 100) { _list.Clear();_list.Add((int)_expect);return; }//防止意外

        GetRandomOnce(_list, _ranNum, _compensate, _expect, _min, _max, _precision);

    }

3,测试

  写个简单方法测试下:

    public int min = 1;//区间最小值
    public int max = 3;//区间最大值
    public float expect = 1.175f;//期望值

    public float precision = 0.5;//精度

   void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            GetAllRandom(expect, min, max, precision);
        }
    }

  得到结果如下:

  当然我们有时候不想随机那么多步骤(纯随机的不确定性),还可以添加更多的约束。

  最后,我们代入扩展再测试下。电脑给出的随机结果如下:

  经过多次测试,实验结果是逼近期望值的(不过取越靠近中间数的话,独立事件的结果偏差可能越大,这里最好再加上一层约束)。

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

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

相关文章

浪涌Surge整改:保护和优化电力系统!|深圳比创达电子EMC

一、浪涌现象简介 浪涌是一种在电气系统中常见的现象&#xff0c;其涉及电压、电流的突然增加&#xff0c;超过系统的正常操作范围。这可能是由许多因素引起的&#xff0c;如雷击、设备故障、或电网中的突然负荷变化。浪涌可能导致设备损坏&#xff0c;甚至可能危及人员安全。…

css引入的三种方式

css引入的三种方式 一、内联样式二、外部样式表三、 内部样式表总结trouble 一、内联样式 内联样式也被称为行内样式。它是将 CSS 样式直接应用于 HTML 元素的 style 属性中的一种方式 <p style"color: blue; font-size: 16px;">这是一个带有内联样式的段落。&…

前后端性能优化实践(含Java代码部分、数据库部分、React前端部分)

最近的一个大屏报表统计的接口查询速度很慢&#xff0c;耗时近一分钟左右&#xff0c;数据量级只是700万左右&#xff0c;但很慢&#xff0c;最后优化到4秒左右&#xff0c;客户还能接受&#xff0c;但其实还可以在优化&#xff0c;先这样吧&#xff0c;简单记录下。这次主要优…

接口测试学习路线

接口测试分为两种&#xff1a; 测试外部接口&#xff1a;系统和外部系统之间的接口 如&#xff1a;电商网站&#xff1a;支付宝支付 测试内部接口&#xff1a;系统内部的模块之间的联调&#xff0c;或者子系统之间的数据交互 测试重点&#xff1a;测试接口参数传递的正确性&…

进制转换 蓝桥oj Alice和Bob的爱恨情仇

题目 翻译 主要思路 举个例子方便理解 以奇数为底去分解一个奇数&#xff0c;分解次数一定是奇数&#xff1b;以奇数为底去分解一个偶数&#xff0c;分解次数一定是偶数 如果一个堆的分解次数是奇数&#xff0c;就在总分解次数上加1&#xff1b;如果一个堆的分解次数是偶数&…

【高级网络程序设计】Week2-1 Sockets

一、The Basics 1. Sockets 定义An abstraction of a network interface应用 use the Socket API to create connections to remote computers send data(bytes) receive data(bytes) 2. Java network programming the java network libraryimport java.net.*;similar to…

VR Interaction Framework2.0使用

1 按键 &#xff0c;比如按压下手柄的B键 if (InputBridge.Instance.BButtonDown){print("kkkkkkbbbbb456");} 2抓取某个物体&#xff0c;那么就在要抓取的那个物体上加一些组件&#xff0c;特别是Grabble Unity Events

都2023年了,为什么大家还都在吹捧 Python?

2023 年&#xff0c;Python 还可学吗&#xff1f; 答案当然是可。 近些年间&#xff0c;Python 的火热有目共睹&#xff0c;作为一种功能强大的高级编程语言&#xff0c;在 2018 年的时候它的流行程度就得到了大幅提高。 图源&#xff1a;Stack Overflow 网站编程语言浏览量统…

累计定点160+车型,商汤绝影凭什么领跑规模化量产?

2023广州车展火热进行&#xff0c;智能化技术加速“内卷”。 商汤绝影多款合作量产车型亮相2023广州车展&#xff0c;包括昊铂 GT、传祺ES9、E8系列和本田雅阁、捷途旅行者、极氪X等&#xff0c;全方位呈现在智能驾驶和智能座舱领域的最新成果&#xff0c;以AI“新科技”&…

「树形」样式,数据关联超便捷丨三叠云

树形样式 路径 表单设计 >> 字段属性 功能简介 「表单关联」的数据列表样式支持「树形」样式功能&#xff0c;关联数据选择时通过「树形」的列表方式进行数据选择&#xff0c;提高生产效率。 使用场景&#xff1a; 可以通过树形列表样式展示部门、子部门、成员的树形…

Android开发从0开始(服务)

Android后台运行的解决方案&#xff0c;不需要交互&#xff0c;长期运行。 服务基础框架&#xff1a; public class MyService extends Service { public MyService() { } Override public IBinder onBind(Intent intent) { //activity与service交互&#xff08;需要继…

美国汽车零部件巨头 AutoZone 遭遇网络攻击

Security Affairs 网站披露&#xff0c;美国汽车配件零售商巨头 AutoZone 称其成为了 Clop MOVEit 文件传输网络攻击的受害者&#xff0c;导致大量数据泄露。 AutoZone 是美国最大的汽车零配件售后市场经销商之一&#xff0c;在美国、墨西哥、波多黎各、巴西和美属维尔京群岛经…

Django项目window环境部署

最近刚好有时间&#xff0c;把前端时间使用django框架开发的音乐网站部署到本地电脑上&#xff0c;在这里记录一下部署过程。 环境配置 Python 3.7.5 Django 3.2.20 Apache 2.4.39 电脑64位 生产环境配置 设置生产环境静态配置 示例如下&#xff1a; # 生产环境静态资源…

windows环境下使用arthas不启动服务替换文件

场景&#xff1a; windows环境&#xff0c;如果现场环境客户正在使用项目&#xff0c;如果要替换项目中的一个class文件&#xff0c;但是又不能重启服务改怎么处理&#xff0c;今天介绍使用arthas中的retransform命令动态替换及使用注意的事项。 环境&#xff1a; windows,arth…

opencv-ORB检测

ORB&#xff08;Oriented FAST and Rotated BRIEF&#xff09;是一种图像特征检测和描述算法&#xff0c;结合了 FAST 关键点检测器和 BRIEF 描述子的优点。ORB 算法具有良好的性能&#xff0c;特别适用于实时应用&#xff0c;如目标追踪、相机定位等。 以下是 ORB 算法的一般…

【Python】生死簿管理系统,估值5毛

生死簿管理系统 代码 """ 生死簿管理系统 """ import os import timefile_name data.txtdef main():while True:main_menu()choice (int)(input("请选择: "))if choice in [0, 1, 2, 3, 4, 5, 6, 7]:if choice 0:answer input(&…

2022年MathorCup高校数学建模挑战赛—大数据竞赛A题58到家家政服务订单分配问题求解全过程文档及程序

2022年MathorCup高校数学建模挑战赛—大数据竞赛 A题 58到家家政服务订单分配问题 原题再现&#xff1a; “58 到家”是“58 同城”旗下高品质、高效率的上门家政服务平台&#xff0c;平台向用户提供家政保洁、保姆、月嫂、搬家、维修等众多生活领域的服务。在家政保洁场景中…

WPF面试题中级篇

WPF中级篇[17] 15. 描述下WPF对象完整的层次结构? Object&#xff1a;Object 是 .NET Framework 中所有类的根类。它提供了一些基本的方法和属性&#xff0c;如 Equals、GetHashCode 和 ToString。所有其他类都直接或间接地继承自 Object。Dispatcher&#xff1a;Dispatcher…

蒸蛋器上平台销售UL1026检测报告标准

蒸蛋器是一种采用发热盘通电后&#xff0c;使盘内产生高温蒸汽来快速把禽蛋蒸熟的一种生活小家电。蒸蛋器最大的特点就是快速、简单&#xff0c;并充满乐趣。 深圳ISO 17025实验室办理蒸蛋器亚马逊美国站UL报告办理UL1026测试标准。 UL1026标准是关于蒸蛋器的安全性要求&…

CMS指纹识别方式

一、手工识别 1.robots.txt文件 robots.txt文件我们写过爬虫的就知道,这个文件是告诉我们哪些目录是禁止爬取的。但是大部分的时候我们都能通过robots.txt文件来判断出cms的类型 如: 从wp路径可以看出这个是WordPress的cms 这个就比较明显了直接告诉我们是PageAdmin cms 也…