为何Lua乘法生成函数始终初始化为相同运算?
为什么你的Lua乘法生成函数每次启动都执行相同运算?
哦,这个问题我太熟了!你遇到的是Lua随机数生成器的经典“坑”——默认情况下,Lua的math.random()每次启动程序时都会使用固定的种子值初始化,所以生成的随机序列完全一致,自然每次启动都会得到相同的乘法运算啦。
背后的原理
Lua的伪随机数生成器(PRNG)需要一个“种子”值来启动它的随机序列生成逻辑。如果种子不变,那它生成的每一个随机数都是固定序列里的内容。默认情况下,Lua会把种子设为1,这就导致每次你启动程序,随机数生成器都从同一个起点开始工作,输出的随机数自然一模一样。
解决方法
要解决这个问题,你只需要在程序的最开始位置(注意是全局只执行一次,别放在函数里)调用math.randomseed(os.time()),用当前系统时间作为随机数种子。因为系统时间每秒都会变化,每次启动程序时的种子值都不一样,随机数生成器就能生成不同的随机序列了。
修改后的代码示例:
-- 初始化随机数种子,放在程序开头只执行一次 math.randomseed(os.time()) function next_number() local a = math.random(1,9) local b = math.random(1,9) local result = tostring(a) .."*".. tostring(b) rightValue = a*b multiplication = result end
额外提醒
千万别把math.randomseed()放到next_number()函数内部!如果每次调用函数都重新初始化种子,短时间内多次调用的话,os.time()返回的时间可能没变化(它返回的是秒级时间),反而会导致生成的随机数重复,变得更不随机。
内容的提问来源于stack exchange,提问作者Kwint
相关产品推荐
相关产品推荐

