找回密码
 点一下
楼主: thewisp1

好吧,各种反编译boss进来,关于【随机数 *预测* 系统】

[复制链接]
发表于 2009-1-29 18:34:14 | 显示全部楼层
果然我灭有说明白吗?

SEED是不变的。变的只是调用GETRANDOM的次数。

GETRANDOM的值是根据调用的次数计算出下一个结果的。

好吧。这回真要的回家吃饭老。好饿。
回复

使用道具 举报

发表于 2009-1-29 18:34:15 | 显示全部楼层
这个帖我实在不想灌水。
回复

使用道具 举报

发表于 2009-1-29 18:35:29 | 显示全部楼层
★:果然我的表达能力不够了么? 代勾么?老了么? 被淘汰了么?
回复

使用道具 举报

 楼主| 发表于 2009-1-29 18:39:13 | 显示全部楼层
引用第35楼loluu于2009-01-29 18:30发表的  :
撇下魔兽到底怎样random不说,即使能做到即时得到randomseed的技术,用来预测掉宝也不现实吧。

掉宝函数里面的random是单位被杀死后运行。。初始运行random的另外一种——随即组
那么只有在单位被灭掉的瞬间去“预测”又有多大的意义呢``
正因为是在死掉时决定,

所以才谈的上预测,否则如果是游戏开局就决定的话,我直接告知即可,不必预测。

野怪掉宝的核心语句是ChooseRandomItemEx,跟GetRandomInt等随机函数、以及其余随机事件互不影响,

他是自成体系的一个函数 。

很明显,野怪掉什么宝物,只取决于两样东西: 随机种子,以及他是第几个死掉的会掉宝物的野怪

随机种子确定了一个数列,每个掉宝物野怪死掉调用一次,因此分配了数列不同的项。


因此,该项技术可以推断出,如果某个会掉宝物的野怪是接下来最先死掉的野怪,那么他会掉什么宝。

当然如果他不是接下来最先死掉的,则变化。


举个简单例子,TR门口4级海龟,由于多数情况下所有人都先练这里,所以两个4级海龟是前2个死掉的掉宝野怪

他们掉什么宝物,已经由这个方式决定了;

但谁的海龟掉什么,则取决于谁的海龟先死。

所谓预测,无非是告知玩家,先死的海龟掉x宝,后死的掉y,你自己看哪个好。

至于其他,可以往野怪头上显示个宝物图像,当然,这只说明如果马上死会掉,如果期间有别的掉宝怪死了。。嗯哼
回复

使用道具 举报

 楼主| 发表于 2009-1-29 18:49:35 | 显示全部楼层
amp34 根据你曾经提到的一段代码是这样

设置随机种子 = 100
随机整数()
//现在随机种子也许=n

仅对玩家0:
    随机整数()
        设置随机种子 = n
endif

你的意思是说,由于不是第1次执行,所以,即使我知道这个n,也无法让他保持稳定。对吧

但按照你的说法,这个差距是纯粹由执行次数引起的,而种子不变

因此如果执行次数 > 1,把种子设回去也没用。那么我们如下改造代码:

设置随机种子 = 100
随机整数()
//现在随机种子也许=n

仅对玩家0:
    随机整数()
endif
设置随机种子 = 100

可以看到,区别只在于最后一行设置随机种子是对所有玩家同步的,而且是设回了一开始的100

(其实设多少都应该无关紧要吧)

按我的说法是,由于种子同步了所以一定不会掉线。

按你的说法是,种子本来就同步,但次数 > 1,不可能同步,因此会掉线。


我们只需要测试这一段代码是否产生掉线,即可判断出谁对谁错了
回复

使用道具 举报

发表于 2009-1-29 19:16:12 | 显示全部楼层
那么就静等实验结果吧~
回复

使用道具 举报

发表于 2009-1-29 19:20:34 | 显示全部楼层
引用第43楼thewisp1于2009-01-29 18:39发表的  :
野怪掉宝的核心语句是ChooseRandomItemEx,跟GetRandomInt等随机函数、以及其余随机事件互不影响,

他是自成体系的一个函数 。

很明显,野怪掉什么宝物,只取决于两样东西: 随机种子,以及他是第几个死掉的会掉宝物的野怪


.......

不过还有一点看不懂~
既然说ChooseRandomItemEx,跟GetRandomInt等随机函数互不影响,而之后又说取决于随即种子,如果得出随机种子随GetRandom变化更新的话,究竟怎样才能自圆其说呢
回复

使用道具 举报

 楼主| 发表于 2009-1-29 19:28:21 | 显示全部楼层
是的,所以正在做实验
回复

使用道具 举报

发表于 2009-1-29 20:00:09 | 显示全部楼层
= =!
显然你自己也知道。决定下一个随机数的条件是SEED和次数。
如果在执行不同步的GETRANDOM操作以后,对所有玩家重新设置相同的SEED。
显然就不会出现所谓“同步”或“不同步”的问题了。。。。因为你已经给所有玩家都重新初始了相同的SEED嘛。

这个问题我觉得楼主已经了解了。所以也没啥米说的了。嗯。
回复

使用道具 举报

 楼主| 发表于 2009-1-29 20:26:51 | 显示全部楼层
刚才通过实验,你的说法是错的,但我最初的也是错的

种子的确是变化的,而并不是不变的。并且对随机事件(如随机攻击力)和各函数都是分开的

可以认为他们从一开始继承了种子的一个副本,并分别演变,所以互不干扰。

而setrandomseed是把所有这些副本置为一个值。把一些分别演变已经不同的值设为一样,怎么可能不掉线呢?

所以实战中,我必须在游戏开始之前算出种子并推出一个数列,之后只用这一数列来算宝物,而不再在游戏过程里运算随机种子。
回复

使用道具 举报

 楼主| 发表于 2009-1-29 20:30:38 | 显示全部楼层
初始化时: 设种子=100

运行测试命令: 对玩家0调用随机(),而后设种子=100


这个过程,在理想测试的条件下,玩家没有任何单位,没有任何事件,则不掉线

如果地图上摆玩家几个单位互相攻击了几下,再运行则会掉线

这说明了

1. 种子是变化的
2. 种子对于所有函数和事件提供一个初始值,分别演化互不干扰
3. setrandomseed会重置所有的初始值,因此在有单位攻击时同样的函数就会掉线
因为他重置种子=100,这对于随机函数来说是正确的种子,但对于随机攻击却是错误的种子

结论:如果要知道掉宝数列,就必须在所有随机事件之前完成计算,

即在创建玩家单位之前,甚至决定出生点位之前

第1步. 在这个过程中运算出原始的种子值,并重设,由于没有其他随机事件和函数,不掉线;
第2步. 根据该种子运算出一个随机数列,直到我需要的次数(例如一共掉宝的个数),并重设,同上
第3步. 在游戏中用算出的随机数列和宝物随机的算法,用每项和当前项算出下一个掉的宝物。这里就跟随机无关了
回复

使用道具 举报

发表于 2009-1-30 00:21:09 | 显示全部楼层
我顶楼上!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-9-30 13:19 , Processed in 0.030807 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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