游戏中的随机数生成chengyouknow

每一款游戏,或大或小,都是由一段段默默无闻的算法在支撑着他们的运作,我们不能只欣赏绚丽的游戏成品表现在我们面前的华丽与光鲜,还要看到那些支撑在华丽与光鲜背后的,鲜为人知的算法。

篇章一引言

我们知道,在游戏领域里,围绕随机性与随机数展开的一系列技术有着非常广阔的运用空间。

比如《地下城与勇士》,《龙之谷》等网游中的通关后翻牌(翻箱子)奖励机制,又比如梦幻西游中变异宝宝的出现等等,以上这些网络游戏中最吸引人的地方,表面上是明丽的图画与彩色的提示语,其实游戏程序要实现这一个个可玩性十足的游戏系统,全都离不开随机数的产生。

我们来假设一个场景,你很喜欢玩DNF,今天你去凯莉那里强化,心爱的武器【死亡舞步】直接一路上了15。看着散发出璀璨光芒的【+15死亡舞步】,你肯定会想,哇,今天人品真好~其实这样的人品好,只不过是计算机的随机数算法得出了一个个合适的随机数数值,能满足强化成功条件设定的临界值罢了。又假设你刚刚单刷深渊爆出了一把【光炎剑-烈日裁决】,其实也是一样的道理,如果深渊BOSS掉落【光炎剑-烈日裁决】的概率是五千分之一,需要的数值是386到390之间,也只不过是在你杀死BOSS的瞬间,计算机的随机数算法算出了一个刚好在386到390之间的随机数值,刚好满足掉落这件PK神器的条件罢了。

引言说了这么多了,无非就是想强调随机数的产生在游戏开发中的重要性,下面就进入正题吧,讲解计算机中随机数的产生方式。

篇章二知识讲解

在开始展开讲之前,我们必须牢记一个概念,计算机中一般不能产生绝对随机的随机数。计算机产生随机数的过程,是根据一个数(我们可以称它为种子)为基准以某个递推公式推算出来的一系列数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是确定的,除非你对系统进行了更改。

即计算机一般情况下只能生成相对的随机数,即伪随机数。

伪随机数并不是假随机数,这里的“伪”是有规律的意思,就是计算机产生的伪随机数既是随机的又是有规律的。怎样理解呢?产生的伪随机数有时遵守一定的规律,有时不遵守任何规律;伪随机数有一部分遵守一定的规律;另一部分不遵守任何规律。比如“世上没有两片形状完全相同的树叶”,这正是点到了事物的特性,即随机性,但是每种树的叶子都有近似的形状,这正是事物的共性,即规律性。

在很多时候,我们会使用rand()函数与srand()配合来达到产生随机数的效果,srand初始化随机种子,rand产生随机数,下面进行展开的分析(当然我们在这里先不考虑某些游戏引擎会另外设计自己的随机数产生机制。):

一、随机数发生器rand()函数的用法

函数名:rand

功能:随机数发生器

用法:intrand(void);

所在头文件:stdlib.h

函数说明:

▲rand()的内部实现是用的线性同余法,它不是真的随机数,因其周期特别长,故在一定的范围里可看成是随机的。

▲这种伪随机数是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子。(注意:小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后它们又重复出现了。)

▲目前,计算机中用来产生随机数的算法基本上都是“线性同余”法。rand()返回一随机数值的范围在0至RAND_MAX间。RAND_MAX的范围最少是在32767之间(int)。

▲用unsignedint双字节是65535,四字节是4294967295的整数范围。0~RAND_MAX每个数字被选中的机率是相同的。

▲用户未设定随机数种子时,系统默认的随机数种子为1。

▲rand()产生的是伪随机数字,每次执行时是相同的;若要不同,用函数srand()初始化它。

下面我们给出第一个小例子

//MyRand01.cpp#includeusingnamespacestd;#include#include#defineMIN1//随机数产生的范围#defineMAX10intmain(){inti;srand((unsigned)time(0));cout<<"10个随机数从"<

函数名:srand

功能:初始化随机数发生器

用法:voidsrand(unsignedintseed);

所在头文件:stdlib.h

函数说明:

▲srand()用来设置rand()产生随机数时的随机数种子。

▲参数seed必须是个整数,通常可以利用time(0)的返回值或NULL来当做seed。

▲如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。

下面我们给出第二个小例子

//MyRand01.cpp#includeusingnamespacestd;#include#include#defineMIN1//随机数产生的范围#defineMAX10intmain(){inti;srand((unsigned)time(0));cout<<"10个随机数从"<

rand()和srand()要一起使用,其中srand()用来初始化随机数种子,rand()用来产生随机数。

四、产生相同的随机数的原因

计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子。(注意:小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后它们又重复出现了。)

我们知道rand()函数可以用来产生随机数,这里我再啰嗦一遍。计算机中一般不能产生绝对随机的随机数。计算机产生随机数的过程,是根据一个数(我们可以称它为种子)为基准以某个递推公式推算出来的一系列数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是确定的,除非你对系统进行了更改。

下面我们给出第三个小例子

//MyRand01.cpp#includeusingnamespacestd;#include#include#defineMIN1//随机数产生的范围#defineMAX10intmain(){inti;srand((unsigned)time(0));cout<<"10个随机数从"<

4118467633426500191691572411478293582696224464

为得到不同的随机数序列,则需改变这个种子的值。方法:在开始产生随机数前,调用一次srand(time(NULL))(注意:srand()一定要放在循环外面或者是循环调用的外面,否则的话得到的是相同的随机数)。

下面我们给出第四个小例子

//MyRand01.cpp#includeusingnamespacestd;#include#include#defineMIN1//随机数产生的范围#defineMAX10intmain(){inti;srand((unsigned)time(0));cout<<"10个随机数从"<

12941856214141181651191029784110701322513124405

177425714187341652820825171899848889925035375

五、几种随机数的简单算法

1.产生一个范围内的随机数

一般地,我们可用j=1+(int)(n*rand()/(RAND_MAX+1.0))来生成一个0到n之间的随机数。

若用intx=rand()%100;来生成0到100之间的随机数这种方法是不可取的,比较好的做法是:

j=(int)(100.0*rand()/(RAND_MAX+1.0))

当然,如果是在gcc,vc之外的编译器,我们也可以使用random(100)。下面的例子都是用了random(n)(VC无法识别random这个函数,VC下我们还是采用j=(int)(100.0*rand()/(RAND_MAX+1.0)).

2、筛选型随机数如希望取0-99的随机数,但不能是6。

解决方法:

x=random(100);while(x==6){x=random(100);}又如希望取0-99的随机数,但不要5的倍数解决方法:

x=random(100);while((x%5)==0){x=random(100);}3、从连续的一段范围内取随机数。

如从40--50的范围内取随机数。解决方法:x=random(11)+40

4、从一组乱数中取随机数。如:从67,87,34,78,12,5,9,108,999,378十个数中随机取数。解决方法:可以用数组将些十个数存贮,然后把0--9中取出的随机数作为序号,实现随机取数。

a=newArray(67,87,34,78,12,5,9,108,999,378);

j=random(10);

x=a[j];

六、产生一定范围随机数的通用算法公式

▲要取得[a,b)的随机整数,使用(rand()%(b-a))+a(结果值含a不含b)。

▲要取得[a,b]的随机整数,使用(rand()%(b-a+1))+a(结果值含a和b)。

▲要取得(a,b]的随机整数,使用(rand()%(b-a))+a+1(结果值不含a含b)。

▲即(通用公式:a+rand()%n;取得[a,a+n)的随机整数,其中的a是起始值,n是整数的范围。)

▲要取得[a,b)的随机整数,另一种表示:a+(int)b*rand()/(RAND_MAX+1)。

▲要取得[a,b]的随机整数另一种表示:a+(int)b*rand()/(RAND_MAX)。

▲要取得[0,1]之间的浮点数,可以使用rand()/double(RAND_MAX)。

了解了随机数产生的基础知识和一些产生随机数的算法,相信大家心里应该有底了,比如如何设置各阶段装备强化的成功率,副本里装备的掉落率,通关奖励翻牌的掉落率,攻击暴击的概率,攻击MISS的几率,梦幻西游里碰到变异宝宝的概率等等。

因为它让你有收获了:

1.计算机的伪随机数是由随机种子根据一定的计算方法计算出来的数值。所以,只要计算方法一定,随机种子一定,那么产生的随机数就是固定的。

2.只要用户或第三方不设置随机种子,那么在默认情况下随机种子值为1,来自系统时钟。

THE END
1.梦幻西游:总预算8万,可以挑战3+3神器,175级五开怎么配置?一组号连带装备大概花费6W,辅助技能买170级的,女儿买180级,输出买175的。剩余2W就搞一组血攻高神吸血鬼或者买那种不带高神的5-6丹宝宝就行了,价格控制在6000左右。然后配置一组高魔心法爆敏捷须弥,价格5000一只。花2000一只买3-4红连善,内丹4-5个就行了,价格控制在1w就可以了,用来补血攻刮痧伤害。 https://ds.163.com/article/64978f587925580001cc0717/
2.梦幻西游:追忆155时代武神坛最巅峰,“4大豪门”笑傲江湖“四大豪门”时期,冥家族给德阳文庙带来了5个冠军,分别是39联、41联、47联、57联、58联。 NO.4、朱紫坊服战队,将“3封控制”用到了极致。 狂魔阿败这个名字,算得上是梦幻历史上的传奇方寸。“封天宫+方寸+五庄+大唐+魔王”的阵容,被称为“3封暴力”打法,利用3个封系实现极致控制,两个攻击点上演暴力点杀,...https://www.wandhao.com/mhxy/43218.html
1.梦幻最新五开,游戏新纪元的多开玩法深度探索输电3、任务分配:根据五个角色的特点和能力,合理分配任务,提高任务完成效率。 4、资源获取:五个角色可以同时采集资源,提高资源获取速度,玩家需关注游戏内的各种活动,以获取更多资源。 5、合理安排时间:五开玩法需要玩家投入较多时间,玩家需合理安排游戏时间,避免影响生活和工作。 http://www.hngxdl.com/post/908.html
2.梦幻西游5开最佳组合平民109(梦幻西游5开最佳组合平民69)1、5开109最佳配置:三修≥10即可,宠修功/法10,这个修炼配置下,我们已经能基本通刷副本和活动。 2、梦幻西游中,对于平民玩家来说,选择最适合的五开组合非常重要。 3、梦幻西游109五开非常注重效率,主要以固伤为主,法系为辅,搭配须弥快速完成副本和活动。 https://www.hdbzf.com/qiche/202411/690184815.html
3.梦幻西游侠水5开攻略,勇闯江湖,一战到底!在开始攻略之前,我们先来了解一下水5开的基本规则,水5开,顾名思义,指的是在游戏中开启第五个“水”属性的关卡,这个关卡的特点是难度较高,但奖励也相对丰厚,玩家需要组成一个强大的队伍,通过策略和配合来战胜强大的敌人。 二、选择合适的队伍配置 在《梦幻西游》中,每个角色都有其独特的技能和属性,选择合适的...http://www.sdkjzn.com/zxgl/7021.html
4.梦幻西游:总预算8万,可以挑战3+3神器,175级五开怎么配置?剩余的2万元预算,可以用来配置一组血攻高神吸血鬼,或者选择不带高神的5-6丹宝宝,价格控制在6000元左右。此外,再配置一组高魔法爆敏捷须弥,每只价格约5000元。最后,用2000元一只的价格购买3-4红连善,内丹选择4-5个,总价控制在1万元以内,用以补充血攻刮痧的伤害。https://www.yoojia.com/ask/17-14274141771940870442.html
5.梦幻西游手游助手阵容(梦幻西游手游助手哪个好用)3、嫦娥+大鹏王+西海龙王+玉兔精(12关可能用的到) 以上三种组合能稳妥的打在13关左右,往后因为我的人物本身不够强力,怪物输出太高,没打过去,后续我会继续更新最便捷高效的阵型; 红尘试炼组合:大鹏王+白象王+青狮王+西海龙王 剧情助战组合:梦幻西游手游的剧情在设定上个人认为相对是比较简单的,同等级在搭配着助手...https://www.hxtkd.com/post/11365.html
6.梦幻西游手游新年奇遇任务(梦幻奇遇任务一天几次)3、以上就是梦幻西游手游新春奇遇花香香选项攻略。乐弦奇遇:①什么春节习俗在迷失之地好推广:春联,鞭炮,红包都可以。②想听哪一种迷失之地春节:火锅,饺子,晚会任选其一即可 梦幻西游手游近期开启了梦长安活动,在事件志中有很多事件需要玩家选择,其中奇遇事件很多玩家不知道选什么好,下面就为大家带来梦幻西游手游梦长安...https://www.asia-appliance.com/jiemao/1564.html
7.梦幻西游任务五庄(梦幻129力五庄经脉)游戏攻略梦幻西游2任务五庄怎么加点 飞升以下的,还是力五庄比较好,满修满技能装备好点的话,5力没问题的,要是搞的还不太好,可以适当加一点耐和体,以后搞好了再洗掉,到时可以考虑加0.5-1敏,速度稍快点。飞升以上的,还是传统体耐敏的吧,1敏有点少,至少1.5吧,剩余3.5体耐均分就可以。 https://www.wzmeili.com/zxgl/1013.html
8.梦幻西游游戏活动灯谜答案180个5、梦幻西游里能够提高躲避力的宝石是 答案:神秘石 6、梦幻西游里查看宠物界面的快捷键是 答案:Alt+P 7、梦幻西游里阴曹地府的森罗殿有几个NPC 答案:11个 8、梦幻西游里麒麟山的太岁府有几个NPC 答案:3 9、梦幻西游里能提高活力上限的辅助技能是 https://www.unjs.com/fanwenwang/ziliao/301104.html
9.梦幻西游155五门抓鬼+师门阵容,每日3小时可月入过千第七:示威,小地图可以不开天眼。例如五庄、普陀、神木,其他的老实开眼。 叶子猪梦幻西游玩家群:1群325703083(2000人),2群:330102322(千人);3群:424986787(游戏疑难解答);4群:330518295(商人物价);5群:1063086037(疑难解答);6群:1045753197(春心萌动);7群:787195090(活跃互动);8群:720665628(全民PK)...https://xyq.yzz.cn/focus/202312/1711546.shtml
10.我家是个动物园四年级作文(通用42篇)“梦幻西游”、“皇室战争”、“奇迹暖暖”她都玩,家里的网从来不关。有时候睡醒了,一看一二点钟,她还会玩一会儿游戏。所以她下午经常没精神,放假的时候每天都睡午觉。我妈的游戏账号非常多,她还给了我几个梦幻西游和王者荣耀的帐号,说等我长大了让我玩,其实是她自己玩不过来了,让我给她做每日活跃任务。https://mip.cnfla.com/zuowen/869991.html
11.梦幻西游狮驼岭变身套3件和5件的区别梦幻西游狮驼岭变身套3件和5件的区别是什么呢?变身套这个就要看自身的财力了,3件套和5件套最大的区别是变身状态时增加的伤害也是有区别。具体的玩法攻略都在梦幻西游狮驼岭变身套效果对比一览中一一告诉大家了,快来看看吧! 梦幻西游狮驼岭变身套3件和5件的区别 ...https://www.3733.com/menghxysy/307226.html
12.梦幻西游109级带3件或5件炼气化神套装每回合恢復多少蓝?多简单的事 https://ask.zol.com.cn/x/13479216.html
13.小学五年级周记(通用36篇)”我与爷爷开心地哈哈大笑起来.此时爷爷说:“那好,现在假设是同一个起点站,你说说用什么方法来解答?”我想了想,脱口而出:“再过15分钟。因为3与5是互质数,求互质数的最小公倍数就等于这两个数的乘积(3×5=15),所以15就是它们的最小公倍数,也就是两路车至少要再过15分钟能同时发车。”爷爷听了,夸我...https://www.yjbys.com/riji/zhouji/1037122.html
14.告别网络游戏作文(通用15篇)我来告诉你们怎样才能知道是否公平:可以算出任意摸出两张卡片数字之和分别为1+2=3,1+3=4,1+4=5,2+3=5,2+4=6,3+4=7,其中结果为:和是奇数的有4种,和是偶数的有2种,出现奇数的可能性,用分数来表示是4/6,出现偶数的可能性为2/6,显然对于我来说不公平,像这种游戏规则的.制定从本身来讲就不公平...https://www.ruiwen.com/zuowen/wangluo/2049570.html
15.梦幻西游特殊符号梦幻西游特殊符号一览梦幻西游特殊符号有哪些?梦幻西游作为一款网游,玩家在取名字的时候会选择取一些比较好听或者好看的名字,接下来小编将给大家带来梦幻西游特殊符号一览,让大家取名更加方便。 梦幻西游特殊符号 1、比较华丽的符号 ?、?、?、?、?...https://mip.ali213.net/gl/html/1193959.html