游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4332|回复: 8

[讨论] 对15%暴击率的疑惑,请教高手

[复制链接]

3

主题

12

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2009-7-31 01:09:00 | 显示全部楼层 |阅读模式
有人问了一个暴击15%的公式问题,一位大侠的回答如下:

      随机roll 1-65535,出来数字除以655去分位的整数,小于15则判定暴击,大于15判不爆。
          Set R为随机整数
          Set R/655=S ,取整数
          判定 S<15暴击 ,S>=15非爆

  小弟有以下疑惑,期望高手指点:
      其一,对上面的公式设立思想我是这样理解的,暴击15%,就是确定一种关系,既某事件出现几率为15%,不出现几率为85%,上面随机数/655后整数的取值中应该有15%的满足小于15,有85%的大于15。

             对此小弟有以下不解,为何要通过随机/655之后来判断,例如我设置:
               
                随机ROLL 1-100  ,如随机数<=15,则暴击;如随机数>15,则不暴击。这样随机从100个数里抽取一数,同样可满足15%的出现几率,程序实现也简单。

                譬如上面大侠设置随机数为1-65535,这样系统会随机产生一数值a,其后a/655=b, 再通过b的值域B来判断与15的关系,如上所说,B内<15和>15的值数量之比为15/85,其实这里仅值域B就体现了 15%的概率,为何要设置A值域,有何意义?
         
      其二,随机取值范围的影响,也许有人说上面我设置1-100的值域是否过小,不能体现统计效果,不够精确;那么可以设置成1-10000,设立被除数为100,除后的结果来判断与15的关系,这样的话依然能体现15%几率问题,还好理解些:这里便是我的第二个疑问,为何上面的大侠要设置1-65535 ,被除数为655,当然,这样也可以达到15%几率的效果,但是,我很难梳理分析出65535和655怎么算出来的。

      其三,我是新手,想从事数值,如果上面我的设置是错的,请指教,对几率我是这样想的,就是设置值域,使满足暴击的与不满足暴击的值数量成比例,从这个角度想就很难推出65535和655怎么来的。希望高手能够详细指导65535和655的计算方法。
                谢谢,有人愿收徒弟请联系258725519
   

1

主题

240

帖子

240

积分

中级会员

Rank: 3Rank: 3

积分
240
发表于 2009-7-31 02:31:00 | 显示全部楼层

Re:对15%暴击率的疑惑,请教高手

LZ,建议你去了解程序那个随机函数RAND(),那你就不会有第一个疑问。

第二个疑问还是来自第一个疑问。你不了解RAND()和rand(1,100)是什么回事。

第三个问题还是来自第一个问题,那个65535不是策划或程序要TMD成这个数,这是,怎么说呢,应该是一个RAND()的范围,是这个函数早就定义好的。

1

主题

240

帖子

240

积分

中级会员

Rank: 3Rank: 3

积分
240
发表于 2009-7-31 02:34:00 | 显示全部楼层

Re:对15%暴击率的疑惑,请教高手

你的第四个问题,LX回答!

1

主题

71

帖子

71

积分

注册会员

Rank: 2

积分
71
发表于 2009-7-31 10:32:00 | 显示全部楼层

Re:对15%暴击率的疑惑,请教高手

你可以将65535换成二进制的 你就明白了

3

主题

134

帖子

275

积分

中级会员

Rank: 3Rank: 3

积分
275
发表于 2009-7-31 15:02:00 | 显示全部楼层

Re:对15%暴击率的疑惑,请教高手

我也不明白,65535换成二进制是16个1.1111111111111111,有什么特别的呢?

8

主题

96

帖子

98

积分

注册会员

Rank: 2

积分
98
发表于 2009-7-31 15:26:00 | 显示全部楼层

Re:对15%暴击率的疑惑,请教高手

恩,百度来了下面的资料:

一、C++中不能使用random()函数

     random函数不是ANSI C标准,不能在gcc,vc等编译器下编译通过。 可改用C++下的rand函数来实现。

     1、C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数。 RAND_MAX必须至少为32767。rand()函数不接受参数,默认以1为种子(即起始值)。 随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。(但这样便于程序调试)
     2、C++中另一函数srand(),可以指定不同的数(无符号整数变元)为种子。但是如果种子相同,伪随机数列也相同。一个办法是让用户输入种子,但是仍然不理想。
     3、 比较理想的是用变化的数,比如时间来作为随机数生成器的种子。 time的值每时每刻都不同。所以种子不同,所以,产生的随机数也不同。
// C++随机函数(VC program)
#include <stdio.h>
#include <iostream>
#include <time.h>
using namespace std;  
#define MAX 100
int main(int argc, char* argv[])
{

       srand( (unsigned)time( NULL ) );//srand()函数产生一个以当前时间开始的随机种子
   for (int i=0;i<10;i++)
   cout<<rand()%MAX<<endl;//MAX为最大值,其随机域为0~MAX-1
   return 0;
}
二、rand()的用法   
     rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数。 这样,如果你要产生0~10的10个整数,可以表达为:
  int N = rand() % 11;
     这样,N的值就是一个0~10的随机数,如果要产生1~10,则是这样:
  int N = 1 + rand() % 11;
  总结来说,可以表示为:
  a + rand() % n
     其中的a是起始值,n是整数的范围。 若要0~1的小数,则可以先取得0~10的整数,然后均除以10即可得到随机到十分位的10个随机小数,若要得到随机到百分位的随机小数,则需要先得到0~100的10个整数,然后均除以100,其它情况依
此类推。
     通常rand()产生的随机数在每次运行的时候都是与上一次相同的,这是有意这样设计的,是为了便于程序的调试。若要产生每次不同的随机数,可以使用srand( seed )函数进行随机化,随着seed的不同,就能够产生不同的随机数。
     如大家所说,还可以包含time.h头文件,然后使用srand(time(0))来使用当前时间使随机数发生器随机化,这样就可以保证每两次运行时可以得到不同的随机数序列(只要两次运行的间隔超过1秒)。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xqls_xqls/archive/2009/02/22/3920791.aspx

3

主题

12

帖子

12

积分

新手上路

Rank: 1

积分
12
 楼主| 发表于 2009-7-31 20:11:00 | 显示全部楼层

Re:对15%暴击率的疑惑,请教高手

4楼的兄弟可否详细指导下二进制的问题,看不出来。
还有网上的随机函数看了,正如6楼说的,RAND_MAX必须至少为32767,那么我也可以设置随机ROLL 1-32767
   把其值域分为15:85  节点是32767* 15%=4915.05,也就是说1-32767之间小于4915.05与大于4915.05的值数量之比为15:85,就可以依次来实现几率问题。因暴击率可变,我们就通过除以某一数使节点值4915.05与暴击率相等来联系两者,即4915.05/15=327.67
   那么暴击率15就可以看为是在随机ROLL1-32767中随机取一数除以327.67,再与15比较,小于15出暴击,否则不暴击。
   为什么上面高手一定要设置随机ROLL 1-65535?
   对此希望2楼或其他高手给与指导。谢谢

0

主题

67

帖子

67

积分

注册会员

Rank: 2

积分
67
发表于 2009-8-2 20:58:00 | 显示全部楼层

Re:对15%暴击率的疑惑,请教高手

首先,随机值ROLL多少是程序的问题,和策划无关,策划只需要知道能不能达到自己预期的效果就可以了;
其次,LZ你自己实机试下,C++(我用的DevC++)rand()的结果在0~65535之间,平均数是32767自由,也就是说,C++生成随机数的方法是是在2字节内存空间内随机(根据时间或者其他什么东西)填充1,
rand()的本身实现方式就是这样,不管你ROLL多少,都要走这这一步,然后换算成预期结果,比如一般脚本语言里面,random()的结果在0到1.0之间,那么实现方式应该是浮点的rand()/65535;
你ROLL 1-100 ,程序取rand()/655是非常正确的

34

主题

425

帖子

479

积分

中级会员

Rank: 3Rank: 3

积分
479
发表于 2009-8-3 09:55:00 | 显示全部楼层

Re:对15%暴击率的疑惑,请教高手

程序优化的结果吧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-16 10:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表