找回密码
 点一下
查看: 2816|回复: 51

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

[复制链接]
发表于 2009-1-29 05:29:29 | 显示全部楼层 |阅读模式
跟actboy168测试的结果

随机种子在每次跟随机有关的事件以后都会改变。包括调用随机函数,例如GetRandomInt

随机种子必须同步,因此单方使用任何随机函数都会导致掉线。

但实验找到了不掉线的方法,那就是当我已知现在的随机种子值的时候,在一些操作后SetRandomSeed把种子设回原值。


实验是这样做的:
local integer i = 0

首先设定随机种子
call SetRandomSeed(100)

而后单方面对某个玩家调用随机函数

if GetLocalPlayer() == Player(0) then
     set i = GetRandomInt(0,237849)
  而后再把随机种子设回去
   call SetRandomSeed(100)
endif


其结果是不掉线,而预测出了在0,237849之间的下一次随机数的结果

由此可见,只要知道随机种子的现在的值,根据需要预测后再设回去就不会影响同步。

而如果不把随机种子设回去,结果是必然掉线。


那么,如何知道随机种子的值?要么通过反编译找到算法,要么通过暴力搜索(?)

总之,通过一定次数的随机,总能够提供越来越多的值,理论上存在一个算法,使用至多x次GetRandomInt,

即可以根据结果逆推出在一定范围内唯一的整数随机种子。

求各种达人乱入。。
 楼主| 发表于 2009-1-29 05:34:44 | 显示全部楼层
用途:对战中预测某野怪如果现在死掉会出什么宝物。
回复

使用道具 举报

发表于 2009-1-29 12:27:03 | 显示全部楼层
各种反编译boss没来,俺来凑人数了. 楼主您坚强点,
回复

使用道具 举报

kw 该用户已被删除
发表于 2009-1-29 12:29:52 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2009-1-29 14:33:42 | 显示全部楼层
LZ研究出同步版DOTA后想加入新功能么...
回复

使用道具 举报

发表于 2009-1-29 14:43:54 | 显示全部楼层
哇.楼上的头像变了.
回复

使用道具 举报

发表于 2009-1-29 15:06:54 | 显示全部楼层
埋下种子以后就要浇水了呢~
回复

使用道具 举报

发表于 2009-1-29 15:12:02 | 显示全部楼层
然后发芽.
回复

使用道具 举报

发表于 2009-1-29 15:16:52 | 显示全部楼层
楼主。你测试的时候。。。
应该这样测试:

[codes=jass]
local int x = 0;
call SetRandomSeed(100)
set x = GetRandomInt(0,100)
if GetLocalPlayer() == Player(0) then
     set x= GetRandomInt(0,237849)
   call SetRandomSeed(100)
endif
set x = GetRandomInt(0,100)
[/codes]

虽然我没测试过,但是我的EXP告诉我肯定不同步。谢谢。
回复

使用道具 举报

发表于 2009-1-29 15:43:45 | 显示全部楼层
hmmm,我觉得a大人的也不同步了
call setRandomSeed(100)
set x = getRandomInt(0,100)
这样随机种子已经变掉了,后面在设回100也不同步了吧
回复

使用道具 举报

发表于 2009-1-29 15:56:51 | 显示全部楼层
显然,我说的就是不同步啊。。。
难道你自动过滤掉那个“不”字了吗?

所以我的意思是。楼主设SEED是灭用的。
回复

使用道具 举报

发表于 2009-1-29 15:58:22 | 显示全部楼层
hmmm,我上面说了“也”啊,a大人自动过滤了“也”字吗~~
回复

使用道具 举报

发表于 2009-1-29 15:58:38 | 显示全部楼层
另外我想说的是。SEED是不会因为调用GetRandomXXX而改变的。。。。
显然程序里的RANDOM素伪RANDOM。。。
具体的百毒好了。。。。
回复

使用道具 举报

发表于 2009-1-29 16:01:24 | 显示全部楼层
呃。我不知道楼主的同步不同步。
我想说的是。。。即使你知道最初的SEED。也不可能会同步的。。。
回复

使用道具 举报

发表于 2009-1-29 16:03:59 | 显示全部楼层
信口开河也要有点限度~~某A~~你可以退场了~~
回复

使用道具 举报

 楼主| 发表于 2009-1-29 16:53:11 | 显示全部楼层
每次随机事件以后都会变掉的

所以我在每次预测之前都必须临时运算当前的种子~~恩恩

运算的方法就是临时random几次而后逆推。为此才需要算法
回复

使用道具 举报

 楼主| 发表于 2009-1-29 16:54:01 | 显示全部楼层
我啥时候说了要求 最初的 种子?
回复

使用道具 举报

发表于 2009-1-29 16:57:30 | 显示全部楼层
●A更●了吗
回复

使用道具 举报

发表于 2009-1-29 17:11:57 | 显示全部楼层
hmm
显然。我要说明的正是这点啊。。。。
SEED灭有RANDOM一次就改变。而是根据最后设置的SEED。按顺序获取该SEED”计算“出来的随机数。。
按楼主方式。每次IF里面获取的RANDOM值显然都是一样的。完全不素随机的呢。嗯。
回复

使用道具 举报

 楼主| 发表于 2009-1-29 17:19:19 | 显示全部楼层
当然是确定的啊

我要做的是找到一个算法 逆推(n) 可以根据n次GetRandomInt的值逆推回n次调用以前那个seed

那么我在某一时刻想要预测一样东西就可以这么做:

GetRandomInt
GetRandomInt
...     

GetRandomInt
共n次
而后seed = 逆推(n)
SetRandomSeed(seed)
到这时为止,我已经保证了不掉线而又找到了当前(这一瞬间)的种子
接下来,没有间隔地使用:
ChooseRandomItemEx(ITEM_TYPE .... ..      ...) 来预测一个掉宝
SetRandomSeed(seed)
再次设回当前seed
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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