找回密码
 点一下
查看: 1695|回复: 7

关于“单位组中的随机单位”的问题

[复制链接]
发表于 2007-11-3 16:06:29 | 显示全部楼层 |阅读模式
我做了个触发,大概就是:
事件: 输如-random
动作:设置p=单位组中随机选取的一个单位
      
但我每次运行游戏都是得到的同一个英雄,好郁闷啊,难道随机单位总是一样的么?
发表于 2007-11-3 16:42:06 | 显示全部楼层
i=GetRandomInt(1,x)
CreateUnit hero for Player(...)
回复

使用道具 举报

发表于 2007-11-3 17:18:45 | 显示全部楼层
随机数可以分为真正的随机数和伪随机数.

伪随机数是用线性同余算法产生的.
因为,产生的随机数要保证两点,第一点是,随机数是平均分布的,第二点是,是随机的.
产生平均分布,一般就是线性同余算法了.

这个算法是,质数a,b,求(0,c)范围内的一个伪随机数
x=(a*x+b)  (mod c)

写成Jass:
[codes=jass]
globals
    integer temp=224
endglobals
function GetRandomInt takes integer bot,integer top returns integer
    set temp=(temp*1103515245)+12345
    set temp=temp/65536
    set temp=temp-temp/(top-bot)+bot
    return temp
endfunction
[/codes]
看一下,这个算法要先设置一个temp值,才能进行,只要temp的值设定好,以后产生的数,实际上就是确定的序列了,也就是你所说的:每次都一样.

问题:      把temp设成随机的不可以么?
回答:      可以.最简单的办法如下用triggersleepaction和真实时间的差

问题:     每产生一个随机数后,重设temp可以不?
回答:     不可以,因为随机数不随机分布了.
回复

使用道具 举报

发表于 2007-11-3 17:44:43 | 显示全部楼层
因为你每次测试地图都用了同一个随机数种子(SEED)
回复

使用道具 举报

 楼主| 发表于 2007-11-3 18:45:09 | 显示全部楼层
恩,以前学c的时候好像也接触过这个伪随机数这个东东,说是计算机给出的随机数是有规律的,具体是什么忘了。
那如何解决呢?用机器时间除英雄个数取余么?会不会太麻烦了啊
回复

使用道具 举报

发表于 2007-11-3 19:10:59 | 显示全部楼层
调用...randomize()
回复

使用道具 举报

 楼主| 发表于 2007-11-4 19:09:29 | 显示全部楼层
哦,收到:)
不过真正玩的时候会不会还是用固定的种子呢?
回复

使用道具 举报

 楼主| 发表于 2007-11-5 17:26:28 | 显示全部楼层
那就好啊,嘿嘿
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 20:46 , Processed in 0.041922 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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