用石器LUA生成的随机数

无论在任何应用当中都会使用随机数,就算在石器时代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


发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。