伪随机的概率可视化

栏目: IT技术 · 发布时间: 4年前

内容简介:在游戏开发中,随机无处不在。随机性带来了偶然性,不容易让玩家产生疲劳。随机则必然伴随着某种概率而产生。比如抽卡,有很小的概率抽到非常稀有的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,则我们可以得到如下图形:

伪随机的概率可视化

我们会发现,原来在不做伪随机的图中,有相当大的比例成为了非酋,他们卡在了低保线上。这些玩家的体验会很差,也许就会因此而离开游戏。而做伪随机保护,则形状没有什么变化,又保证了总体期望一致。何乐而不为呢?


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

引爆点

引爆点

【加】马尔科姆•格拉德威尔(Malcolm Gladwell) / 钱清、覃爱冬 / 中信出版社 / 2014-4 / 36.00元

《引爆点》是《纽约客》怪才格拉德威尔的一部才华横溢之作。他以社会上突如其来的流行潮为切入点,从全新角度探索了控制科学和营销模式。他认为,思想、行为、信息及产品常会像传染病暴发一样迅速传播。正如一个病人就能引起全城流感;几位涂鸦爱好者能在地铁掀起犯罪浪潮;一位满意而归的顾客还能让新开张的餐馆座无虚席;发起小规模流行的团队能引发大规模流行风暴。这些现象均属“社会流行潮”,它达到临界水平并爆发的那一刻,......一起来看看 《引爆点》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具