Lua中如何让含math.random()的全局变量每次生成新随机数?
解决Lua每次运行生成相同随机数的问题
问题根源
Lua的math.random函数默认使用固定的种子值初始化随机数生成器,所以每次运行程序时,生成的随机数序列完全一致。你用goto跳转的方式完全没触及问题本质,而且你的标签写法有误(Lua标签不允许包含空格,正确格式是::标签名::),所以才会出现识别失败的情况。
正确解决方案
在调用math.random之前,先用math.randomseed()初始化随机数种子,通常用当前系统时间作为种子(时间值每次运行都不同),修改后的代码如下:
-- 用当前系统时间初始化随机数种子,确保每次运行种子唯一 math.randomseed(os.time()) spam = math.random(100) eggs = math.random(100) yams = math.random(100) hams = math.random(100) if eggs > spam then print("eggs are better than spam") end if spam > eggs then print("spam is better than eggs") end if yams > hams then print("yams are better than hams") end if hams > yams then print("hams are better than yams") end print(spam) print(hams) print(eggs) print(yams)
补充说明
os.time()返回从固定时间点到当前的秒数,每次运行程序时该值都不同,能保证随机数种子的唯一性,从而生成不同的随机数序列。- 注意:
math.randomseed()只需要调用一次即可,无需在每次生成随机数前重复调用,重复调用反而可能破坏随机数的分布合理性。 - 若确实需要使用
goto,正确的标签格式应为::Label::(标签名前后无空格),但即便写法正确,这种跳转也无法解决随机数重复的问题,因为它仅控制代码循环,并未重置随机数生成器的种子。
内容的提问来源于stack exchange,提问作者Java762
相关产品推荐
相关产品推荐

