加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

unity 物品的随机概率

(2017-03-11 13:34:56)
分类: unity3d

假如,一个敌人,会掉落一些物品,

而这些物品,很可能会有一定的随机性,

例如,

30%概率 掉落金钱, 30%概率掉落 钻石, 40%概率 掉落某样装备,

正常情况,可能会填写一个概率,

例如, 0.3,0,3,0,6,

总和加一起,是 100%,

但是,如果用 百分比添加,

在修改这个掉落概率表时,会有一个问题,

那就是 ,当我们想从掉落 3种,改为 掉落 4种时,

之前的概率需要修改,而且,修改过后,总数不一定正好等于 100% 。

那么,有没有什么比较好的概率填写方法呢?


可以用 权重的概念,

例如,  A物品的权重值是 10,
B 物品的权重值也是 10,

那么,当这两种商品都存在时,那么,各占50%,

如果 C物品的权重值是 5,

那么,当只有  A 和 C 两种物品的时候,那么 A占 三分之二的概率, C 占三分之一的概率。

如果是这样,

那么,假如有三个物品, A B C , 权重各是 10,10,5 ,那么,各自的概率就是 10/25 , 10/25, 5/25 ,

这样,当我们想要添加一个新的物品D,

其权重也是 5时,

原本的物体随机概率自动变为 10/30,10/30,5/30 。

随机时,可以使用 Random.Range(0,总数);

以上面的例子为例,

A 10 ,B 10,C 5,D 5

那么,随机值就是 0 到 29,

A 占随机值的范围为 0 到 9

B 占随机值的范围为 10 到 19

C 占随机值的范围为 20 到 24

D 占随机值的范围为 25 到 29 


ABCD 各自不用存储下限,只需要存储上限。

随机的数字可以 遍历 A B C D, 

谁符合条件,就是随机到的谁。

int value = Random.Range(0,30);

假如,随机的值是 15,

那么就是 B ,

因为 A 的上限不符合,

但是 B 的上限是符合的。

 

各自的上限可以这样存储,

totalChance = 0;

循环开始
{

chance 是自己的权重,
自己的随机上限 = chance + totalChance;
totalChance += chance;
}

这样,只需要读取一边,
上限就有了.




0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有