找回密码
 点一下
查看: 3623|回复: 27

怎样获得真正的随机数

[复制链接]
发表于 2007-12-17 16:32:34 | 显示全部楼层 |阅读模式
这里说的"真正"的随机数并不是讨论"伪随机数"的对立面, 而是指怎么样获得每次不同的伪随机数序列.

比如打开地图之后,第一个GetRandomInt()返回11,第二个返回13,第三个返回15. 重新打开地图,结果仍然依次是11,13,15. 而且每次打开地图这个随机数序列都一样.

尝试过用SetRandomSeed()函数, 结果仍然一样.

又尝试了SetRandomSeed( H2I(gt_SeeEnemy) ), 这里gt_SeeEnemy是一个已经创建好的trigger, 我期待这样的结果: 由于trigger是handle,所以在C++层面上它是一个动态分配的指针,那么H2I(gt_SeeEnemy)就是一个内存地址的integer表示, 由于指针是动态分配的, 每次多半应该不一样, 从而达到每次用不同的integer参数调用SetRandomSeed(). 结果依然不成功.

请问怎么解决这个问题?
发表于 2007-12-17 16:34:45 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2007-12-17 17:27:45 | 显示全部楼层
查了无数的国外网站,都是一种回答: 文件菜单->优先选择->测试地图->把"使用固定随机种子"的勾去掉.

问题是: 我不是用WE的测试地图功能,所以跟这个设置应该无关. 而且我是用DAII把代码插入到未解密的DotA地图里去的,所以没办法修改这个设置. 自己解密出来的DotA地图用WE打开后不做任何修改存盘会报错... 楼上说的开源地图区在哪里?

忘记说了,我发现trigger似乎不是指针,因为有奇数的trigger值,指针应该是能被4整除的偶数.奇怪.
回复

使用道具 举报

 楼主| 发表于 2007-12-17 17:37:49 | 显示全部楼层
找到开源地图区了,只看到OpenDotA 6.41,我要做的是最新版DotA(6.49b)......
回复

使用道具 举报

发表于 2007-12-17 18:01:02 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2007-12-17 18:10:01 | 显示全部楼层
[codes=jass]
globals
      integer seed=224
endglobals

function GetRandomInt takes integer bot,integer top returns integer
      set seed=(seed*1103515245)+12345
      set seed=seed/65536
      set seed=seed-seed/(top-bot+1)+bot
      return seed
endfunction
[/codes]
这面的东西就是随机数产生的线性同余算法,标准的WE也是这样做的.
那个seed,最开始的是时候是224,如果是这样,随机数就固定了,也就是你所的情况.
如果哪一次开始游戏,都把seed设置成一个不一样的值,就可以了.
回复

使用道具 举报

发表于 2007-12-17 18:10:47 | 显示全部楼层
哎呀,忘了没隐身,罪过罪过...
回复

使用道具 举报

发表于 2007-12-17 18:12:56 | 显示全部楼层
引用第2楼ala5于2007-12-17 17:27发表的  :
查了无数的国外网站,都是一种回答: 文件菜单->优先选择->测试地图->把"使用固定随机种子"的勾去掉.

问题是: 我不是用WE的测试地图功能,所以跟这个设置应该无关. 而且我是用DAII把代码插入到未解密的DotA地图里去的,所以没办法修改这个设置. 自己解密出来的DotA地图用WE打开后不做任何修改存盘会报错... 楼上说的开源地图区在哪里?

忘记说了,我发现trigger似乎不是指针,因为有奇数的trigger值,指针应该是能被4整除的偶数.奇怪.
你现在还没有了解什么是指针呢吧.
呵呵.
难道,你以为一个C中的int数组为array,要array+32,或是array+4,才能得到array[1]不成么??呵呵.哈...
回复

使用道具 举报

发表于 2007-12-17 18:13:01 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2007-12-17 18:13:01 | 显示全部楼层
找到答案了,原来这么简单:
call SetMapFlag(MAP_LOCK_RANDOM_SEED,false)

为什么说这个主题不适合JASS区......
回复

使用道具 举报

发表于 2007-12-17 18:18:56 | 显示全部楼层
本来都到600帖了,都是根着你这种人一起灌水,结果都被删了.
回复

使用道具 举报

发表于 2007-12-17 18:19:57 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2007-12-17 18:32:02 | 显示全部楼层
To 朱朱:

谢谢你的回答.

不过你前面的代码对我这个话题没有任何帮助. 而后面说的关于指针,希望你去看看有关handle的书或者文章.是你错了,不是我.

另外, 还是搞不懂为什么要把这个帖子移出JASS区. 难道综合区也讨论编程,而且JASS区绝对不允许讨论编程之外的东西? 这个问题完全就是JASS问题.
回复

使用道具 举报

发表于 2007-12-17 18:36:06 | 显示全部楼层
引用第12楼ala5于2007-12-17 18:32发表的  :
To 朱朱:

谢谢你的回答.

不过你前面的代码对我这个话题没有任何帮助. 而后面说的关于指针,希望你去看看有关handle的书或者文章.是你错了,不是我.
.......
可能是我真的错了.
可是,那个H2I的值,不是内存的.  是一个大数组的下标而己啊..
回复

使用道具 举报

 楼主| 发表于 2007-12-17 18:48:02 | 显示全部楼层
"H2I的值,不是内存的.  是一个大数组的下标而己"

能详细说说吗?
回复

使用道具 举报

发表于 2007-12-17 19:07:41 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2007-12-17 19:21:01 | 显示全部楼层
把左边的东西想成一个指针数组吧,右边的东西是真正的内存区.

不过,并不是这么简单的,因为还有"引用数"这么一说的.
那个指针数组,也是很怪的,或者说,有4个指针数组的.

单位,物品,英雄,树木,这种是handle型的,
还有一种是code型的,还有一种是字符串型的,还有一种是闪电与漂浮文字,
这4块独立,所占位置也不一样.  code型规律难找.  
无标题.jpg
回复

使用道具 举报

发表于 2007-12-17 19:21:54 | 显示全部楼层
只是我的朱氏猜想,如果出错了,可不负责的.
回复

使用道具 举报

发表于 2007-12-17 23:22:13 | 显示全部楼层
呃,基本上,因为jass属于解释脚本,而不像C++这样直接编译成机器码的程序。
所以对于JASS中的handle,也只是这个object的一个索引,而不真正指代内存的地址。
回复

使用道具 举报

发表于 2007-12-24 16:44:52 | 显示全部楼层
jass那个不是指针嘛。。就是war3自己分配结构的一个索引。
比如10xxxx就是timer类型的地址什么的。
如果war3可以自己随便分配内存地址那他就不用jass脚本而该用c了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-1 17:28 , Processed in 0.171655 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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