无论在任何应用当中都会使用随机数,就算在石器时代SF里也不例外,很多我们用到比如随机坐标点,随机奖励,随机怪物,随机属性等。但是通过使用math.random(x)函数出来的随机数会有规律,非常不理想,视作为伪随机数。
因此我们可以在lua里加入math.randomseed(os.time())这个随机种子。但还是存在着问题,也不是很不理想,为什么这么说呢?因为随机种子是以秒的单位来随机,要知道石器里封包速度都是按照毫秒甚至微秒的速度,如果连续使用随机数,这种效果随机数就不行了。所以在石器服务端里一直存在着利用封包来开启宠物包的时候,因为都是毫秒来开启,导致出现的宠物4V会是一模一样的。
为了让LUA生成一个比较理想的随机数,把os.time()返回的数值字串进行颠倒倒然后再进行取高位的7位。 这样即使os.time()变化很小,随机数种子也会很大。
math.randomseed(tostring(os.time()):reverse():sub(1, 7))
给大家个例子参考下:
function luckcard(itemindex, charaindex, toindex, haveitemindex) local rnd = math.random(100) for i = 1, table.getn(drawlist) do if rnd <= 30 then npc.AddItem(charaindex, drawlist[i]) else npc.AddItem(charaindex, drawlist[i]) end return end end function data() --注意,一定要写到data这个函数里,否则没效果 math.randomseed(tostring(os.time()):reverse():sub(1, 7)) drawlist ={1, 2, 3, 4, 5, 6, 7, 8, 9, 10} end function main() data() item.addLUAListFunction( "ITEM_LUCKCARD", "luckcard", "") end
发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。