Lua中math.random()和math.randomseed()的区别

10

我正在使用Corona SDK和Lua作为编程语言开发游戏。在从表格中获取随机数时,我不确定应该使用以下哪种方法?

math.random()
math.randomseed()

有人能详细解释它们之间的确切区别吗?这样我就可以在我的情况下使用最好的一个。


1
https://en.wikipedia.org/wiki/Random_seed - hjpotter92
3个回答

11

如果您调用math.random()时需要相同的随机数序列,则必须在调用math.random()之前设置math.randomseed(相同的数字)

如果您想要不同的随机数序列,则在调用math.random()之前传递math.randomseed(os.time()),因为os.time()将返回秒数,所以每次都会不同。

请参考以下链接并查看其中的示例。

https://docs.coronalabs.com/api/library/math/randomseed.html


6
每次调用math.random时,不应将math.randomseed设置为os.time!这样种子会非常接近,实际上生成的随机数会不够随机。只需在开始时调用一次math.randomseed并让math.random完成其工作即可。 - warspyking

11

math.random 函数可以产生随机数,如果程序需要用到随机数,很可能会多次调用这个函数。

math.randomseed 函数决定了由 math.random 生成的随机数序列的起点。在程序需要随机数时仅需调用一次该函数。

有一个常见的误解认为,在每次调用 math.random 函数之前都需要调用 math.randomseed 函数。这是错误的做法,会破坏随机性。


3
非常感谢你提到了最后那部分内容。师傅没有提到,我在查看你的评论之前就进行了评论。 - warspyking
2
我还要补充一点,使用相同的数字调用randomseed将会得到与random返回的相同数字序列,这在游戏测试中有时非常方便。 - Paul Kulchenko

7
当您执行使用math.random的程序时,如果没有设置math.randomseed,通常会产生相同的一组随机数。这是因为math.randomseed负责为由math.random产生的随机数设置默认的种子(或算法生成器)。
显然,这种一致性不是随机的。让我举个例子-首先进入Lua演示网站,然后插入以下代码:
for i = 1,10 do
print(math.random())
end

不断点击运行按钮,观察解释器每次都会产生相同的数字。然而,为了改变生成随机数的“种子”,我们可以将“seed”设置为当前时间(因为当前时间不重复)。

这次,请在网站上多次执行以下代码:

math.randomseed(os.time())
for i = 1,10 do
print(math.random())
end

你现在应该注意到每次获得的数字都是不同的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接