泰坦之旅刷装备与联机的一点关系

上传人:张哥 文档编号:196506125 上传时间:2023-03-30 格式:DOC 页数:9 大小:23.50KB
收藏 版权申诉 举报 下载
泰坦之旅刷装备与联机的一点关系_第1页
第1页 / 共9页
泰坦之旅刷装备与联机的一点关系_第2页
第2页 / 共9页
泰坦之旅刷装备与联机的一点关系_第3页
第3页 / 共9页
资源描述:

《泰坦之旅刷装备与联机的一点关系》由会员分享,可在线阅读,更多相关《泰坦之旅刷装备与联机的一点关系(9页珍藏版)》请在装配图网上搜索。

1、为什么不取消掉伪随机?因为TQ中紫色装备的属性是会上下浮动的,一旦取消掉伪随机,玩家几乎将永远无法刷到属性优秀的紫色装备,因此伪随机的存在是有重大价值与意义的。关于伪随机更加详细的详细阐述请查阅本贴2楼随机数可能存在偏差但是数值应该是固定的。简单说就是任何任务在80级时平均刷4次哈迪斯与龟洞100%会掉落1-2件紫色装备。伪随机会影响掉落紫色装备的种类比如频繁掉落JP装备堕落者。但是伪随机不会影响掉落紫色装备的数量。伪随机常识:用计算机来模拟随机序列都是使用“伪随机发生器(pseudo-random variable generator)”。伪随机发生器其实就是通过函数来产生一系列看上去像是随

2、机的数,不过所有的伪随机发生器都有一个周期,经过一个周期之后,之前的序列会重复出现(真正的随机序列肯定不会出现这种状况)。因此,一个好的伪随机发生器要有一个非常长的循环周期,使得同样的序列不那么容易重复出现。比如下面是一个产生正态序列的伪随机数发生器:1) 任意给定一个种子(Seed)2) 令X1 = Seed 3) 令X2 = exp ( 5 ln(X1) )4) 产生第一个随机数 R1 = X2 - Integer (X2)5) 令Seed = R1,重复1) - 4),生成第二个随机数R2,依此类推下去形成一个正态的随机序列R1, R2, .泰坦里的伪随机数发生器的算法肯定跟这个简单例子

3、不一样,但是大致原理差不多,大家感觉不那么“随机”的原因可能是使用的伪随机数发生器的周期不够长,或者seed出了问题,这两者都有可能。没有源码显然无法对这个问题做出进一步判断。很多人刷了很久也出不了自己想要的装备。这是很正常的。为何?每个角色创建的时候就赋予了角色一个值。该角色某些装备可以说完全不会被打出来,而有些装备则频频出现,就是这个值在起作用了。而这个值,是一生不变的。所以说联机容易出装备的道理就在这里了。因为是多人玩,那么每个人的值是不同,出某些装备的几率也更随机化。以前怎么也不会出现的词缀和装备也就更容易出现一些。所以,刷装备,要么你有多个角色轮流刷,要么,就选择联机。一个角色不停的

4、重复刷实在是最蠢 最浪费精神的办法了。这个理论下:拉人,尽可能不影响游戏速度情况下越多人联机,得到物品的可能性越随机化。Lordbane:伪随机就是在玩家建立帐号以后,其部分物品的掉率都是固定的且无法预知的,特别是紫色装备,并非是完全依照泰坦立方上的掉率伪随机已经被证明确实存在。简单说,有的帐号会频繁刷出某件装备,而有的装备出现的概率却微乎其微。但是,伪随机有利有弊,并非是绝对的消极,主要体现在以下4点:1、任何帐号只要刷装备的时间达到大约半年之内,是几乎可以刷到TQ中任何一件紫色装备的已经被测试过,也就是说,刷装备的时间基本可以弥补伪随机带来的弊端。2、因为伪随机对导致某件装备多次出现,这对

5、于许多优秀装备而言是非常好的有利条件,比如一个帐号频繁刷到堕落者,那么将会大幅缩短玩家刷装备的时间。3、伪随机相当于变相鼓励玩家多建新号,不要拘泥于一种职业,这一点是非常明智的,因为不同的职业不同的玩法不同派别才会让玩家从各个角度了解泰坦之旅。4、伪随机最大的特点是与爱因斯坦的相对论一致,简单说就是证明了“人为规定的偶然”是“客观存在的必然”的结果,爱因斯坦说过的“上帝不玩色子”来证明量子力学“不确定性原理”存在缺陷,爱因斯坦的相对论认为宇宙中一切现象都存在其原因与原动力游戏装备的掉率也包含其中。1、首先需要声明的是,计算机不会产生绝对随机的随机数,计算机只能产生“伪随机数”。其实绝对随机的随

6、机数只是一种理想的随机数,即使计算机怎样发展,它也不会产生一串绝对随机的随机数。计算机只能生成相对的随机数,即伪随机数。 2、严格地说,这里的计算机是指由冯诺依曼思想发展起来的电子计算机。而未来的量子计算机或许有可能产生基于自然规律的不可重现的“真”随机数。“真”随机数恐怕要配合“有机物”才会实现,纯“无机物”的电脑是永远永远也无法产生基于自然规律的不可重现的“真”随机数的。大家可能很多次讨论过随机数在计算机中怎样产生的问题,在这篇文章中,我会对这个问题进行更深入的探讨,阐述我对这个问题的理解。 首先需要声明的是,计算机不会产生绝对随机的随机数,计算机只能产生“伪随机数”。其实绝对随机的随机数

7、只是一种理想的随机数,即使计算机怎样发展,它也不会产生一串绝对随机的随机数。计算机只能生成相对的随机数,即伪随机数。 伪随机数并不是假随机数,这里的“伪”是有规律的意思,就是计算机产生的伪随机数既是随机的又是有规律的。怎样理解呢?产生的伪随机数有时遵守一定的规律,有时不遵守任何规律;伪随机数有一部分遵守一定的规律;另一部分不遵守任何规律。比如“世上没有两片形状完全相同的树叶”,这正是点到了事物的特性,即随机性,但是每种树的叶子都有近似的形状,这正是事物的共性,即规律性。从这个角度讲,你大概就会接受这样的事实了:计算机只能产生伪随机数而不能产生绝对随机的随机数。(严格地说,这里的计算机是指由冯诺

8、依曼思想发展起来的电子计算机。而未来的量子计算机有可能产生基于自然规律的不可重现的“真”随机数) 那么计算机中随机数是怎样产生的呢?有人可能会说,随机数是由“随机种子”产生的。没错,随机种子是用来产生随机数的一个数,在计算机中,这样的一个“随机种子”是一个无符号整形数。那么随机种子是从哪里获得的呢? 下面看这样一个C程序: /rand01.c #include static unsigned int RAND_SEED; unsigned int random(void) RAND_SEED=(RAND_SEED*123 59)%65536; return(RAND_SEED); void r

9、andom_start(void) int temp2; movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4); RAND_SEED=temp0; main() unsigned int i,n; random_start(); for(i=0;i10;i ) printf(%ut,random(); printf(n); 这个程序(rand01.c)完整地阐述了随机数产生的过程: 首先,主程序调用random_start()方法,random_start()方法中的这一句我很感兴趣: movedata(0x0040,0x006c,FP_SEG

10、(temp),FP_OFF(temp),4); 这个函数用来移动内存数据,其中FP_SEG(far pointer to segment)是取temp数组段地址的函数,FP_OFF(far pointer to offset)是取temp数组相对地址的函数,movedata函数的作用是把位于0040:006CH存储单元中的双字放到数组temp的声明的两个存储单元中。这样可以通过temp数组把0040:006CH处的一个16位的数送给RAND_SEED。 random用来根据随机种子RAND_SEED的值计算得出随机数,其中这一句: RAND_SEED=(RAND_SEED*123 59)%65

11、536; 是用来计算随机数的方法,随机数的计算方法在不同的计算机中是不同的,即使在相同的计算机中安装的不同的操作系统中也是不同的。我在linux和windows下分别试过,相同的随机种子在这两种操作系统中生成的随机数是不同的,这说明它们的计算方法不同。 现在,我们明白随机种子是从哪儿获得的,而且知道随机数是怎样通过随机种子计算出来的了。那么,随机种子为什么要在内存的0040:006CH处取?0040:006CH处存放的是什么? 学过计算机组成原理与接口技术这门课的人可能会记得在编制ROM BIOS时钟中断服务程序时会用到Intel 8253定时/计数器,它与Intel 8259中断芯片的通信使

12、得中断服务程序得以运转,主板每秒产生的18.2次中断正是处理器根据定时/记数器值控制中断芯片产生的。在我们计算机的主机板上都会有这样一个定时/记数器用来计算当前系统时间,每过一个时钟信号周期都会使记数器加一,而这个记数器的值存放在哪儿呢?没错,就在内存的0040:006CH处,其实这一段内存空间是这样定义的: TIMER_LOW DW ? ;地址为 0040:006CH TIMER_HIGH DW ? ;地址为 0040:006EH TIMER_OFT DB ? ;地址为 0040:0070H 时钟中断服务程序中,每当TIMER_LOW转满时,此时,记数器也会转满,记数器的值归零,即TIMER

13、_LOW处的16位二进制归零,而TIMER_HIGH加一。rand01.c中的 movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4); 正是把TIMER_LOW和TIMER_HIGH两个16位二进制数放进temp数组,再送往RAND_SEED,从而获得了“随机种子”。 现在,可以确定的一点是,随机种子来自系统时钟,确切地说,是来自计算机主板上的定时/计数器在内存中的记数值。这样,我们总结一下前面的分析,并讨论一下这些结论在程序中的应用: 1.随机数是由随机种子根据一定的计算方法计算出来的数值。所以,只要计算方法一定,随机种子一定,那么产生的随机

14、数就不会变。 看下面这个C 程序: /rand02.cpp #include #include using namespace std; int main() unsigned int seed=5; srand(seed); unsigned int r=rand(); cout / 编辑者注:可能代码有缺 在相同的平台环境下,编译生成exe后,每次运行它,显示的随机数都是一样的。这是因为在相同的编译平台环境下,由随机种子生成随机数的计算方法都是一样的,再加上随机种子一样,所以产生的随机数就是一样的。 2.只要用户或第三方不设置随机种子,那么在默认情况下随机种子来自系统时钟(即定时/计数器的

15、值) 看下面这个C 程序: /rand03.cpp #include #include using namespace std; int main() srand(unsigned)time(NULL); unsigned int r=rand(); cout return 0; 这里用户和其他程序没有设定随机种子,则使用系统定时/计数器的值做为随机种子,所以,在相同的平台环境下,编译生成exe后,每次运行它,显示的随机数会是伪随机数,即每次运行显示的结果会有不同。 3.建议:如果想在一个程序中生成随机数序列,需要至多在生成随机数之前设置一次随机种子。 看下面这个用来生成一个随机字符串的C 程

16、序: /rand04.cpp #include #include using namespace std; int main() int rNum,m=20; char *ch=new charm; for ( int i = 0; i /大家看到了,随机种子会随着for循环在程序中设置多次 srand(unsigned)time(NULL); rNum=1 (int)(rand()/(double)RAND_MAX)*36); /求随机值 switch (rNum) case 1: ch=a; break ; case 2: ch=b; break ; case 3: ch=c; break

17、 ; case 4: ch=d; break ; case 5: ch=e; break ; case 6: ch=f; break ; case 7: ch=g; break ; case 8: ch=h; break ; case 9: ch=i; break ; case 10: ch=j; break ; case 11: ch=k; break ; case 12: ch=l; break ; case 13: ch=m; break ; case 14: ch=n; break ; case 15: ch=o; break ; case 16: ch=p; break ; case

18、 17: ch=q; break ; case 18: ch=r; break ; case 19: ch=s; break ; case 20: ch=t; break ; case 21: ch=u; break ; case 22: ch=v; break ; case 23: ch=w; break ; case 24: ch=x; break ; case 25: ch=y; break ; case 26: ch=z; break ; case 27:ch=0; break; case 28:ch=1; break; case 29:ch=2; break; case 30:ch=

19、3; break; case 31:ch=4; break; case 32:ch=5; break; case 33:ch=6; break; case 34:ch=7; break; case 35:ch=8; break; case 36:ch=9; break; /end of switch cout /end of for loop cout return 0; 而运行结果显示的随机字符串的每一个字符都是一样的,也就是说生成的字符序列不随机,所以我们需要把srand(unsigned)time(NULL); 从for循环中移出放在for语句前面,这样可以生成随机的字符序列,而且每次运

20、行生成的字符序列会不同(呵呵,也有可能相同,不过出现这种情况的几率太小了)。 如果你把srand(unsigned)time(NULL);改成srand(2);这样虽然在一次运行中产生的字符序列是随机的,但是每次运行时产生的随机字符序列串是相同的。把srand这一句从程序中去掉也是这样。 此外,你可能会遇到这种情况,在使用timer控件编制程序的时候会发现用相同的时间间隔生成的一组随机数会显得有规律,而由用户按键command事件产生的一组随机数却显得比较随机,为什么?根据我们上面的分析,你可以很快想出答案。这是因为timer是由计算机时钟记数器精确控制时间间隔的控件,时间间隔相同,记数器前后

21、的值之差相同,这样时钟取值就是呈线性规律的,所以随机种子是呈线性规律的,生成的随机数也是有规律的。而用户按键事件产生随机数确实更呈现随机性,因为事件是由人按键引起的,而人不能保证严格的按键时间间隔,即使严格地去做,也不可能完全精确做到,只要时间间隔相差一微秒,记数器前后的值之差就不相同了,随机种子的变化就失去了线性规律,那么生成的随机数就更没有规律了,所以这样生成的一组随机数更随机。这让我想到了各种晚会的抽奖程序,如果用人来按键产生幸运观众的话,那就会很好的实现随机性原则,结果就会更公正。 最后,我总结两个要点: 1.计算机的伪随机数是由随机种子根据一定的计算方法计算出来的数值。所以,只要计算方法一定,随机种子一定,那么产生的随机数就是固定的。 2.只要用户或第三方不设置随机种子,那么在默认情况下随机种子来自系统时钟。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!