Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Random 为什么在lua的某些平台上,第一个随机数总是相同的?_Random_Lua - Fatal编程技术网

Random 为什么在lua的某些平台上,第一个随机数总是相同的?

Random 为什么在lua的某些平台上,第一个随机数总是相同的?,random,lua,Random,Lua,考虑以下lua代码片段: local time = os.time() for _= 1, 10 do time = time + 1 print('Seeding with ' .. time) math.randomseed(time) for i = 1, 5 do print('\t' .. math.random(100)) end end 在Linux机器上,结果与预期一样是随机数。但似乎至少在MacOSX上,更改种子后的第一

考虑以下lua代码片段:

local time = os.time()
for _= 1, 10 do
    time = time + 1
    print('Seeding with ' .. time)
    math.randomseed(time)
    for i = 1, 5 do
        print('\t' .. math.random(100))
    end
end
在Linux机器上,结果与预期一样是随机数。但似乎至少在MacOSX上,更改种子后的第一个随机数总是相同的

我想这与Lua依赖C rand()函数生成随机数有关,但有人对此有解释吗

编辑:以下是上述代码在linux机器上的输出摘录(即输出如预期):


在OS X机器上,“使用…”设定种子后的第一个数字始终为66。

如果使用相同的种子,则会从C rand()函数中获得相同的数字字符串,但每次都应该获得不同的数字字符串,因为您似乎使用当前时间作为种子

编辑:我想我应该详细说明我的答案。如果在使用os.time()进行种子设定时未获得随机数字字符串,则可能无法从该函数调用中获得预期的结果。从os.time()返回的值是什么


编辑#2:另外,该代码块的输出是什么?

通常,使用数值相近的种子多次调用srand是个坏主意(尤其是使用时间值)。在许多情况下,第一个随机数的方差与种子的方差相似。在处理必须转换数字表示的脚本语言时,情况可能更糟


如果您将种子值更改得更大,是否会发生同样的情况?

Lua的random用于使用C的
rand(3)
srand(3)
函数()。更新:更新的Lua版本

C90标准和POSIX都建议跨平台实现
rand
srand
,这不是最好的。它尤其缺乏低位的随机性

像Linux这样的一些平台脱离了标准建议,转而采用更好的实现(例如)


OS/X仍然遵循经典的
rand
实现,Lua继承了它。

正如其他人所指出的,Lua出于可移植性的考虑故意使用C90随机生成器——C90 RNG不是很好


如果您需要好的随机数,请使用一些Lua模块来获得它。例如,Mersenne Twister RNG是否由Lua作者之一绑定。

两台机器上是否使用相同的Lua版本?可能是Mac OS X one中的错误。是的,我使用最新的lua版本。我很清楚使用相同的种子会产生相同的伪随机数序列。我的问题是,对于不同的种子,在某些平台上,第一个生成的数字似乎是相同的。这仍然不能真正解释为什么他总是得到66作为第一个返回的数字,但这是一个很好的信息。算法“不是最好的”是一种轻描淡写的说法;)它没有做它应该做的,并且完全没有用和坏了。不,你不能说“你不应该这样使用它”,程序员不应该被要求具备这些知识。没有一个C标准,包括C90,为
rand
srand
定义了任何类型的实现。它们只是指定函数应该做什么(返回伪随机数)。这些标准确实包含一个示例实现,但示例在ISO标准中并不规范——它们没有施加任何约束。C的实现允许使用他们想要的
rand
srand
的任何版本,并且使用示例以外的定义肯定不是“不一致的”。我建议你改变你的措辞:)(例如:)@ChuckyEllison很公平!
$ lua test.lua
Seeding with 1232472273
    69
    30
    83
    59
    84
Seeding with 1232472274
    5
    21
    63
    91
    27
[...]