泰坦之旅刷装备与联机一点关系.doc
9页为什么不取消掉伪随机?因为TQ中紫色装备的属性是会上下浮动的,一旦取消掉伪随机,玩家几乎将永远无法刷到属性优秀的紫色装备,因此伪随机的存在是有重大价值与意义的关于伪随机更加详细的详细阐述请查阅本贴2楼随机数可能存在偏差但是数值应该是固定的简单说就是任何任务在80级时平均刷4次哈迪斯与龟洞100%会掉落1-2件紫色装备伪随机会影响掉落紫色装备的种类——比如频繁掉落JP装备堕落者但是伪随机不会影响掉落紫色装备的数量伪随机常识:用计算机来模拟随机序列都是使用“伪随机发生器(pseudo-random variable generator)”伪随机发生器其实就是通过函数来产生一系列看上去像是随机的数,不过所有的伪随机发生器都有一个周期,经过一个周期之后,之前的序列会重复出现(真正的随机序列肯定不会出现这种状况)因此,一个好的伪随机发生器要有一个非常长的循环周期,使得同样的序列不那么容易重复出现比如下面是一个产生正态序列的伪随机数发生器:1) 任意给定一个种子(Seed)2) 令X1 = Seed π3) 令X2 = exp ( 5 ln(X1) )4) 产生第一个随机数 R1 = X2 - Integer (X2)5) 令Seed = R1,重复1) - 4),生成第二个随机数R2,依此类推下去形成一个正态的随机序列{R1, R2, ...}泰坦里的伪随机数发生器的算法肯定跟这个简单例子不一样,但是大致原理差不多,大家感觉不那么“随机”的原因可能是使用的伪随机数发生器的周期不够长,或者seed出了问题,这两者都有可能。
没有源码显然无法对这个问题做出进一步判断很多人刷了很久也出不了自己想要的装备这是很正常的为何?每个角色创建的时候就赋予了角色一个值该角色某些装备可以说完全不会被打出来,而有些装备则频频出现,就是这个值在起作用了而这个值,是一生不变的所以说联机容易出装备的道理就在这里了因为是多人玩,那么每个人的值是不同,出某些装备的几率也更随机化以前怎么也不会出现的词缀和装备也就更容易出现一些所以,刷装备,要么你有多个角色轮流刷,要么,就选择联机一个角色不停的重复刷实在是最蠢 最浪费精神的办法了这个理论下:拉人,尽可能不影响游戏速度情况下越多人联机,得到物品的可能性越随机化Lordbane:伪随机就是在玩家建立帐号以后,其部分物品的掉率都是固定的且无法预知的,特别是紫色装备,并非是完全依照泰坦立方上的掉率——伪随机已经被证明确实存在简单说,有的帐号会频繁刷出某件装备,而有的装备出现的概率却微乎其微但是,伪随机有利有弊,并非是绝对的消极,主要体现在以下4点:1、任何帐号只要刷装备的时间达到大约半年之内,是几乎可以刷到TQ中任何一件紫色装备的——已经被测试过,也就是说,刷装备的时间基本可以弥补伪随机带来的弊端。
2、因为伪随机对导致某件装备多次出现,这对于许多优秀装备而言是非常好的有利条件,比如一个帐号频繁刷到堕落者,那么将会大幅缩短玩家刷装备的时间3、伪随机相当于变相鼓励玩家多建新号,不要拘泥于一种职业,这一点是非常明智的,因为不同的职业不同的玩法不同派别才会让玩家从各个角度了解泰坦之旅4、伪随机最大的特点是与爱因斯坦的相对论一致,简单说就是证明了“人为规定的偶然”是“客观存在的必然”的结果,爱因斯坦说过的“上帝不玩色子”来证明量子力学“不确定性原理”存在缺陷,爱因斯坦的相对论认为宇宙中一切现象都存在其原因与原动力——游戏装备的掉率也包含其中1、首先需要声明的是,计算机不会产生绝对随机的随机数,计算机只能产生“伪随机数”其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样发展,它也不会产生一串绝对随机的随机数计算机只能生成相对的随机数,即伪随机数 2、严格地说,这里的计算机是指由冯诺依曼思想发展起来的电子计算机而未来的量子计算机或许有可能产生基于自然规律的不可重现的“真”随机数真”随机数恐怕要配合“有机物”才会实现,纯“无机物”的电脑是永远永远也无法产生基于自然规律的不可重现的“真”随机数的。
大家可能很多次讨论过随机数在计算机中怎样产生的问题,在这篇文章中,我会对这个问题进行更深入的探讨,阐述我对这个问题的理解 首先需要声明的是,计算机不会产生绝对随机的随机数,计算机只能产生“伪随机数”其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样发展,它也不会产生一串绝对随机的随机数计算机只能生成相对的随机数,即伪随机数 伪随机数并不是假随机数,这里的“伪”是有规律的意思,就是计算机产生的伪随机数既是随机的又是有规律的怎样理解呢?产生的伪随机数有时遵守一定的规律,有时不遵守任何规律;伪随机数有一部分遵守一定的规律;另一部分不遵守任何规律比如“世上没有两片形状完全相同的树叶”,这正是点到了事物的特性,即随机性,但是每种树的叶子都有近似的形状,这正是事物的共性,即规律性从这个角度讲,你大概就会接受这样的事实了:计算机只能产生伪随机数而不能产生绝对随机的随机数严格地说,这里的计算机是指由冯诺依曼思想发展起来的电子计算机而未来的量子计算机有可能产生基于自然规律的不可重现的“真”随机数) 那么计算机中随机数是怎样产生的呢?有人可能会说,随机数是由“随机种子”产生的没错,随机种子是用来产生随机数的一个数,在计算机中,这样的一个“随机种子”是一个无符号整形数。
那么随机种子是从哪里获得的呢? 下面看这样一个C程序: //rand01.c #include static unsigned int RAND_SEED; unsigned int random(void) { RAND_SEED=(RAND_SEED*123 59)%65536; return(RAND_SEED); } void random_start(void) { int temp[2]; movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4); RAND_SEED=temp[0]; } main() { unsigned int i,n; random_start(); for(i=0;i<10;i ) printf("%u\t",random()); printf("\n"); } 这个程序(rand01.c)完整地阐述了随机数产生的过程: 首先,主程序调用random_start()方法,random_start()方法中的这一句我很感兴趣: movedata(0x0040,0x006c,FP_SEG(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)%65536; 是用来计算随机数的方法,随机数的计算方法在不同的计算机中是不同的,即使在相同的计算机中安装的不同的操作系统中也是不同的我在linux和windows下分别试过,相同的随机种子在这两种操作系统中生成的随机数是不同的,这说明它们的计算方法不同 现在,我们明白随机种子是从哪儿获得的,而且知道随机数是怎样通过随机种子计算出来的了那么,随机种子为什么要在内存的0040:006CH处取?0040:006CH处存放的是什么? 学过《计算机组成原理与接口技术》这门课的人可能会记得在编制ROM BIOS时钟中断服务程序时会用到Intel 8253定时/计数器,它与Intel 8259中断芯片的通信使得中断服务程序得以运转,主板每秒产生的18.2次中断正是处理器根据定时/记数器值控制中断芯片产生的在我们计算机的主机板上都会有这样一个定时/记数器用来计算当前系统时间,每过一个时钟信号周期都会使记数器加一,而这个记数器的值存放在哪儿呢?没错,就在内存的0040:006CH处,其实这一段内存空间是这样定义的: TIMER_LOW DW ? ;地址为 0040:006CH TIMER_HIGH DW ? ;地址为 0040:006EH TIMER_OFT DB ? ;地址为 0040:0070H 时钟中断服务程序中,每当TIMER_LOW转满时,此时,记数器也会转满,记数器的值归零,即TIMER_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.随机数是由随机种子根据一定的计算方法计算出来的数值所以,只要计算方法一定,随机种子一定,那么产生的随机数就不会变 看下面这个C 程序: //rand02.cpp #include #include using namespace std; int main() { unsigned int seed=5; srand(seed); unsigned int r=rand(); cout< // 编辑者注:可能代码有缺 } 在相同的平台环境下,编译生成exe后,每次运行它,显示的随机数都是一样的这是因为在相同的编译平台环境下,由随机种子生成随机数的计算方法都是一样的,再加上随机种子一样,所以产生的随机数就是一样的。
2.只要用户或第三方不设置随机种子,那么在默认情况下随机种子来自系统时钟(即定时/计数器的值) 看下面这个C 程序: //rand03.cpp #include #include using namespace std; int main() { srand((unsigned)time(NULL)); unsigned int r=rand(); cout< return 0; } 这里用户和其他程序没有设定随机种子,则使用系统定时/计数器的值做为随机种子,所以,在相同的平台环境下,编译生成exe后,每次运行它,显示的随机数会是伪随机数,即每次运行显示的结果会有不同 3.建议:如果想在一个程序中生成随机数序列,需要至多在生成随机数之前设置一次随机种子 看下面这个用来生成一个随机字符串的C 程序: //rand04.cpp #include #include using namespace std; int main() { int rNum,m=20; char *ch=new char[m]; for ( int i = 0; i //大家看到了,随机种。

卡西欧5800p使用说明书资料.ppt
锂金属电池界面稳定化-全面剖析.docx
SG3525斩控式单相交流调压电路设计要点.doc
话剧《枕头人》剧本.docx
重视家风建设全面从严治党治家应成为领导干部必修课PPT模板.pptx
黄渤海区拖网渔具综合调查分析.docx
2024年一级造价工程师考试《建设工程技术与计量(交通运输工程)-公路篇》真题及答案.docx
【课件】Unit+3+Reading+and+Thinking公开课课件人教版(2019)必修第一册.pptx
嵌入式软件开发流程566841551.doc
生命密码PPT课件.ppt
爱与责任-师德之魂.ppt
制冷空调装置自动控制技术讲义.ppt


