内容简介:在游戏开发中,随机无处不在。随机性带来了偶然性,不容易让玩家产生疲劳。随机则必然伴随着某种概率而产生。比如抽卡,有很小的概率抽到非常稀有的SSR卡,而有较大的概率抽到更为普通的R卡。可以说随机的体验从某种程度上决定了游戏的体验。在我们的游戏中,也有类似抽卡的环节。最开始,每一次抽卡,我们都按照既定的概率来抽。这样会有一个问题,即每一个玩家的体验都不一样。少数欧皇随便一抽便能获得SSR,而大部分人则要抽很多次才能抽到一张SSR卡。每一个人的体验都不一样,甚至差距甚远。相当一部分玩家因为很久没有抽到SSR卡,而
在游戏开发中,随机无处不在。随机性带来了偶然性,不容易让玩家产生疲劳。随机则必然伴随着某种概率而产生。比如抽卡,有很小的概率抽到非常稀有的SSR卡,而有较大的概率抽到更为普通的R卡。可以说随机的体验从某种程度上决定了游戏的体验。
在我们的游戏中,也有类似抽卡的环节。最开始,每一次抽卡,我们都按照既定的概率来抽。这样会有一个问题,即每一个玩家的体验都不一样。少数欧皇随便一抽便能获得SSR,而大部分人则要抽很多次才能抽到一张SSR卡。每一个人的体验都不一样,甚至差距甚远。相当一部分玩家因为很久没有抽到SSR卡,而弃游了。
为了解决这个问题,我们引入了DOTA2使用的 伪随机算法 。这个算法非常简单,给定一个初始概率$P_{init}$,则第N次抽卡获得概率为$P(N) = N * P_{init}$。这样一开始的概率很低,而随着抽卡次数的提升,慢慢概率会攀升到必出的概率。
通过大数定律,我们可以通过模拟抽卡100万次,来确定在初始概率为$P_{init}$下,获得SSR卡的期望次数。比如$P_{init} = 0.085$,我们可以算出,期望次数为4,即原来的25%概率出。
通过下图,我们可以看出伪随机和之前完全随机的区别(蓝色为伪随机)。
我们可以发现,伪随机会让大部分玩家的体验集中到一个区域,即大部分玩家的体验不会特别差,也不会特别欧皇。而之前的随机,会有较多玩家变成欧皇,而一些非酋可能抽很多次都抽不到一个SSR。
进一步的,我们设置一个保底线$R$,即当抽卡次数$N >= R$,我们令$P(N) = 1$,即必出SSR。
可以看到,通过概率图形,我们可以直观的了解大部分玩家的体验。而这种可视化工作,我们可以通过一个非常简单的 python 脚本来实现。这其中的核心便是matplotlib模块。
我们可以通过 python -m pip install matplotlib 来安装这个核心绘图模块,剩下的代码将会非常简单。
以20次的期望为例:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import print_function
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import random
plt.figure(figsize=(15, 2))
n = 100 #X轴长度(最大显示人数)
x = list(range(n+1))
y = [0]*(n+1)
prob = 0.05 #原定概率
N = 1000000 #模拟抽卡次数
db = 0 #欧皇限制
tb = 500 #低保限制
print("原定概率:", prob, "模拟抽卡次数:", N, "欧皇限制:", db, "低保限制:", tb)
cut = min(tb, n) - 1
ct = 0
for i in range(N):
ct += 1
if ct >= db and (random.random() < prob or ct >= tb):
if ct < n:
y[ct] += 1
ct = 0
x = x[1:]
y = y[1:]
print("真随机 最后抽到概率期望:", sum(y) / N, "低保线玩家占比:", y[cut]/sum(y))
plt.subplot(131)
plt.bar(x, y)
x = list(range(n+1))
y = [0]*(n+1)
C = 0.0038 #伪随机调整值,调整到最后期望与预期差不多即可
ct = 0
for i in range(N):
ct += 1
if ct >= db and (random.random() < ct * C or ct >= tb):
if ct < n:
y[ct] += 1
ct = 0
x = x[1:]
y = y[1:]
print("伪随机 最后抽到概率期望:", sum(y) / N, "低保线玩家占比:", y[cut]/sum(y))
plt.subplot(132)
plt.bar(x, y)
plt.show()
我们可以得到如下图形:
其中左侧是不做概率保护,纯随机;右侧是伪随机。可以看到,左侧玩家的体验不是特别好,大部分玩家很容易就抽到SSR,而有一些玩家抽100次都抽不到。右侧玩家的体验则相对集中,60次还抽不到SSR的非酋极少,大部分都集中在20-40次的区间内。
如果我们设置一个低保线为60,即60次以上必得SSR,则我们可以得到如下图形:
我们会发现,原来在不做伪随机的图中,有相当大的比例成为了非酋,他们卡在了低保线上。这些玩家的体验会很差,也许就会因此而离开游戏。而做伪随机保护,则形状没有什么变化,又保证了总体期望一致。何乐而不为呢?
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 这是一本好玩的可视化统计概率入门书
- 算法工程师的数学基础:如何理解概率分布函数和概率密度函数
- 低概率问题分析解决
- 力扣 (1514):概率最大的路径
- 科普 | 贝叶斯概率模型一览
- 哈希函数的概率数据结构
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
HTTP Essentials
Stephen A. Thomas、Stephen Thomas / Wiley / 2001-03-08 / USD 34.99
The first complete reference guide to the essential Web protocol As applications and services converge and Web technologies not only assume HTTP but require developers to manipulate it, it is be......一起来看看 《HTTP Essentials》 这本书的介绍吧!