【结构与算法】—— 游戏概率常用算法整理 | 游戏中的常见概率设计分析

这篇具有很好参考价值的文章主要介绍了【结构与算法】—— 游戏概率常用算法整理 | 游戏中的常见概率设计分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【结构与算法】—— 游戏概率常用算法整理 | 游戏中的常见概率设计分析

  • 📢博客主页:肩匣与橘
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由肩匣与橘编写,首发于CSDN🙉
  • 📢生活依旧是美好而又温柔的,你也是✨ 

目录

一、随机数生成

二、概率分布

2.1均匀分布

2.2正态分布

2.3泊松分布

三、随机事件触发

3.1固定概率触发

3.2基于概率分布的触发

3.3基于条件的触发

四、常见概率算法

4.1概率表

4.2权重随机

4.3概率分布函数

五、真随机和伪随机


       在游戏开发中,概率技术是非常重要的一部分。它涉及到游戏中的随机事件,如掉落物品、怪物出现、技能触发等。正确使用概率技术可以使游戏更加有趣和具有挑战性。

一、随机数生成

       在游戏中,随机数生成是非常常见的。我们需要生成随机数来模拟各种随机事件。在C++中,我们可以使用rand函数来生成随机数。rand函数返回一个介于0和RAND_MAX(通常是32767)之间的整数。我们可以使用模运算和加法来生成指定范围内的随机数。 例如,我们要生成1到100之间的随机数,可以使用以下代码:

int randomNumber = rand() % 100 + 1;

二、概率分布

       在游戏中,我们经常需要使用不同的概率分布来模拟各种随机事件。以下是一些常见的概率分布:

2.1均匀分布

       均匀分布是最基本的概率分布之一。在均匀分布中,每个数字出现的概率是相等的。我们可以使用rand函数来生成均匀分布。 例如,我们要生成1到6之间的随机数,可以使用以下代码:

int randomNumber = rand() % 6 + 1;

2.2正态分布

       正态分布是另一个常见的概率分布。在正态分布中,大多数数字集中在平均值附近,并且随着距离平均值的增加而变得越来越少。我们可以使用Box-Muller转换来生成正态分布。 以下是一个生成具有指定平均值和标准差的正态分布的代码示例:

double normalRandomNumber(double mean, double stddev)
{
    static double n2 = 0.0;
    static int n2_cached = 0;
    if (!n2_cached)
    {
        double x, y, r;
        do
        {
            x = 2.0*rand()/RAND_MAX - 1;
            y = 2.0*rand()/RAND_MAX - 1;
            r = x*x + y*y;
        }
        while (r == 0.0 || r > 1.0);
        {
            double d = sqrt(-2.0*log(r)/r);
            double n1 = x*d;
            n2 = y*d;
            double result = n1*stddev + mean;
            n2_cached = 1;
            return result;
        }
    }
    else
    {
        n2_cached = 0;
        return n2*stddev + mean;
    }
}

2.3泊松分布

       泊松分布是用于模拟随机事件发生的数量的分布。在泊松分布中,事件发生的概率是相等的,而事件发生的次数是随机的。我们可以使用以下代码来生成泊松分布:

int poissonRandomNumber(double lambda)
{
    double L = exp(-lambda);
    double p = 1.0;
    int k = 0;
    do
    {
        k++;
        double u = rand()/((double)RAND_MAX + 1);
        p *= u;
    }
    while (p > L);
    return k - 1;
}

三、随机事件触发

       在游戏中,我们经常需要触发各种随机事件,如掉落物品、怪物出现、技能触发等。我们可以使用概率技术来控制这些事件的触发概率。以下是一些常见的随机事件触发技术:

3.1固定概率触发

       在固定概率触发中,我们使用一个固定的概率来控制事件的触发。例如,我们可以使用以下代码来控制一个事件以50%的概率触发:

bool shouldTrigger = (rand() % 2 == 0);
if (shouldTrigger)
{
    // 触发事件
}

3.2基于概率分布的触发

       在基于概率分布的触发中,我们使用一个特定的概率分布来控制事件的触发。例如,我们可以使用以下代码来控制一个事件以正态分布的概率触发:

double mean = 0.5;
double stddev = 0.1;
double randomNumber = normalRandomNumber(mean, stddev);
if (randomNumber > 0 && randomNumber < 1)
{
    // 触发事件
}

3.3基于条件的触发

       在基于条件的触发中,我们使用一个或多个条件来控制事件的触发。例如,我们可以使用以下代码来控制一个事件仅在满足一定条件时触发:

bool condition1 = true;
bool condition2 = false;
if (condition1 && !condition2)
{
    // 触发事件
}

四、常见概率算法

4.1概率表

       概率表是一种最简单的概率算法。它将所有的可能结果列出,并为每个结果分配一个概率值。然后,使用随机数生成器来生成一个随机数,并根据随机数选择一个结果。 例如,我们有一个掉落物品的概率表,其中掉落物品的概率分别为30%、20%和10%:

物品 概率
物品A 30%
物品B 20%
物品C 10%

       我们可以使用随机数生成器来生成一个随机数,例如在Java中,我们可以使用以下代码:

import java.util.Random;
public class Example {
    public static void main(String[] args) {
        Random random = new Random();
        // 生成一个随机整数
        int randomInt = random.nextInt(100);
        // 判断掉落的物品
        if (randomInt < 30) {
            // 掉落物品A
        } else if (randomInt < 50) {
            // 掉落物品B
        } else {
            // 掉落物品C
        }
    }
}

       上述代码中,我们生成一个0到99的随机整数,并根据随机数选择掉落的物品。

4.2权重随机

       权重随机是一种更加高级的概率算法。它将所有的可能结果列出,并为每个结果分配一个权重值。然后,使用随机数生成器来生成一个随机数,并根据权重值选择一个结果。 例如,我们有一个掉落物品的权重表,其中掉落物品的权重分别为3、2和1:

物品 权重
物品A 3
物品B 2
物品C 1

       我们可以使用随机数生成器来生成一个随机数,并根据权重值选择掉落的物品,例如在Java中,我们可以使用以下代码:

import java.util.Random;
public class Example {
    public static void main(String[] args) {
        Random random = new Random();
        // 生成一个随机整数
        int randomInt = random.nextInt(6);
        // 判断掉落的物品
        if (randomInt < 3) {
            // 掉落物品A
        } else if (randomInt < 5) {
            // 掉落物品B
        } else {
            // 掉落物品C
        }
    }
}

       上述代码中,我们生成一个0到5的随机整数,并根据权重值选择掉落的物品。

4.3概率分布函数

       概率分布函数是一种更加复杂的概率算法。它通过一个数学函数来计算每个结果的概率值。然后,使用随机数生成器来生成一个随机数,并根据概率分布函数计算出选择的结果。 例如,我们有一个技能释放的概率分布函数,其中释放技能的概率随时间逐渐增加。我们可以使用以下的代码计算释放技能的概率,其中,time表示时间,a表示技能开始释放的时间,k表示技能释放的速率。我们可以使用随机数生成器来生成一个随机数,并使用概率分布函数计算释放技能的概率,我们可以使用以下代码:

import java.util.Random;
public class Example {
    public static void main(String[] args) {
        Random random = new Random();
        // 生成一个随机浮点数
        double randomDouble = random.nextDouble();
        // 计算释放技能的概率
        double time = getTime();
        double a = 0.0;
        double k = 1.0;
        double probability = 1.0 / (1.0 + Math.exp(-k * (time - a)));
        // 判断是否释放技能
        if (randomDouble < probability) {
            // 释放技能
        }
    }
    private static double getTime() {
        // 获取当前时间
        return 0.0;
    }
}

       上述代码中,我们生成一个0到1的随机浮点数,并根据概率分布函数计算释放技能的概率。如果随机数小于概率值,我们就释放技能。

五、真随机和伪随机

       在游戏开发中,概率是一个非常重要的概念。我们通常使用随机数进行生成,例如怪物掉落物品、技能释放概率等等。然而,在使用随机数时,开发者需要考虑到真随机和伪随机的问题。        伪随机数生成器(PRNG)是一种算法,它可以生成一个序列的数字,这些数字看起来像是随机的,但实际上是按照算法生成的。在PRNG中,种子值是非常重要的。如果我们使用相同的种子值,我们将会获得相同的随机数序列。

       真随机数生成器(TRNG)是基于物理事件的,例如大气噪声、微粒衰变等等。它们可以生成真正的随机数,因为它们是由不可预测的物理事件生成的。然而,在大多数情况下,我们可以使用伪随机数生成器来模拟真随机数。

       可以说,真随机是一种自然的随机机制,用代码来实现也非常容易,只需要用一个随机数与一个常量进行比较,根据大于小于等于分别触发不同的结果就行了。例如:掷色子,掷到到的值大于3触发什么奖励,小于三又是什么奖励,等于三又是另一种奖励。而伪随机则是人为创造出来的一种机制,他需要程序员写下更多的代码,也需要数值设计者做更多的计算。例如游戏的抽奖机制,当玩家抽到第90次还没有最好品质的奖励,那么第九十次必定获得该奖励,同时在获得该道具后,概率又恢复初始;亦或者是每次没有获得该道具,概率就增加,到第90次,概率是100%,必得该奖励,同时在获得该奖励后,概率又恢复初始。


       在游戏开发中,概率技术是非常重要的一部分。我们可以使用随机数生成、概率分布和随机事件触发等技术来模拟各种随机事件,使游戏更加有趣和挑战性。在实际开发中,我们应该根据具体情况选择适当的技术,并进行充分的测试和优化,以确保游戏的质量和稳定性。文章来源地址https://www.toymoban.com/news/detail-446420.html

到了这里,关于【结构与算法】—— 游戏概率常用算法整理 | 游戏中的常见概率设计分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 字符串常见算法整理

    句子反转 构造新字符串办法 字符串的旋转 移动数组 第 i(1)个出现N次的字符在当前字符串中的索引 第 i(1) 个不重复的字符在当前字符串中的索引 两个字符串比较求最优算法 比较差异度 拓扑结构相同的子树 变形词问题 子串判断 ## KMP算法实现 ## 处理字符环(加长一倍

    2024年02月16日
    浏览(49)
  • 博弈论算法常见模型整理

    本文主要介绍算法竞赛中常常出现的博弈论模型,包括: 4个经典组合游戏 SG函数 SG游戏及拓展 进一步学习需要了解一些前置概念 ICG 博弈图 P点、N点 mex函数 1.ICG ICG全称为“公平组合游戏”,我们下面讨论的博弈游戏均建立在ICG的基础上,那么什么是ICG呢,它需要满足以下条

    2023年04月26日
    浏览(43)
  • 回溯算法中常见的使用方法逻辑整理

    回溯算法 常见的使用方法逻辑整理 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,

    2024年04月15日
    浏览(50)
  • 【算法小记】——机器学习中的概率论和线性代数,附线性回归matlab例程

    内容包含笔者个人理解,如果错误欢迎评论私信告诉我 线性回归matlab部分参考了up主DR_CAN博士的课程 在回归拟合数据时,根据拟合对象,可以把分类问题视为一种简答的逻辑回归。在逻辑回归中算法不去拟合一段数据而是判断输入的数据是哪一个种类。有很多算法既可以实现

    2024年01月24日
    浏览(42)
  • JavaScript数据结构与算法整理------数组

            数组的标准定义: 一个存储元素的线性集合,元素可以通过索引来任意存取,索引通常是数字,用来计算元素之间存储位置的偏移量 ,几乎所有的编程语言都有类似的数据结构,而JavaScript的数组略有不同。         JavaScript中的数组是一种特殊的对象,用来表示偏

    2023年04月24日
    浏览(59)
  • 算法、数据结构、计算机系统、数据库MYSQL、概率论、数学实验MATLAB、数学建模、马原、英语、杂项、QT项目

    可以三个条件 以此类推 (condition1)?x:(condition2)?y:z string变成int int 变成string 可以用循环 模运算展开式推导 我们要证明等式: (a * b) mod m = ((a mod m) * (b mod m)) mod m 假设 a = q1 * m + r1 ,其中 q1 是 a 除以 m 的商, r1 是 a 除以 m 的余数。类似地,假设 b = q2 * m + r2 ,其中

    2024年02月08日
    浏览(61)
  • [游戏数值] 常用刷新次数钻石消耗的设计

    以一定规律增加 能够在较少次数内增加到较大数值 平滑增长 增加值=INT((当前序号-1)/X)*Y+Z X=2,表示希望几个一组,通过INT()取整可获得0、0、1、1、2、2…这样的序列 Y=10,表示基础值,将上述序列变为0、0、10、10、20、20… Z=10,表示每组增加值,将上述序列变为10、10、20、

    2024年02月15日
    浏览(35)
  • 数据结构与算法常见题

    1. 字符串变形 描述 : 对于一个长度为 n 字符串,我们需要对它做一些变形。 首先这个字符串中包含着一些空格,就像\\\"Hello World\\\"一样,然后我们要做的是把这个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。 示例1 输入: “This is a sample”,16 返回值: “SAM

    2024年02月14日
    浏览(34)
  • 数据结构之常见排序算法

    排序:就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 稳定性:假设一组序列中,有两个相同的元素,在排序之后,两个相同元素的前后顺序颠倒了,说明这个排序算法是不稳定的,反之。 思路:把待排序的记录按其关键码值的大小

    2024年02月11日
    浏览(32)
  • 数据结构-常见的排序算法

    目录 排序的概念及其运用 排序的概念 常见的排序算法 常见排序算法的实现 插入排序 插入排序 希尔排序(缩小增量排序) 选择排序 直接选择排序 堆排序 交换排序 冒泡排序 快速排序 归并排序 非比较排序 排序算法复杂度及稳定性分析 排序 :所谓排序,就是按照某个或者某

    2024年03月12日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包