Lua,随机的有多随机?

我需要验证我们的Lua实现的随机数生成器的能力。

以下是我设计的...

 for i = 1,10000 do                         -- 希望是一万

 X = math.random(0,9)

 if     X == 0 then This_Many_0 = This_Many_0 + 1
 elseif X == 1 then This_Many_1 = This_Many_1 + 1
 elseif X == 2 then This_Many_2 = This_Many_2 + 1
 elseif X == 3 then This_Many_3 = This_Many_3 + 1
 elseif X == 4 then This_Many_4 = This_Many_4 + 1
 elseif X == 5 then This_Many_5 = This_Many_5 + 1
 elseif X == 6 then This_Many_6 = This_Many_6 + 1
 elseif X == 7 then This_Many_7 = This_Many_7 + 1
 elseif X == 8 then This_Many_8 = This_Many_8 + 1
 elseif X == 9 then This_Many_9 = This_Many_9 + 1

 else               Bogus_Alert = True      -- 最好不要发生

 end                                        -- 结束大的if / elseif块

 The_Interim_Sum = The_Interim_Sum + X      -- 保持运行总和

 end                                        -- 这是i循环

然后我打印了结果,如下所示...

 Running
 Number of times we got 0  ...  1019
 Number of times we got 1  ...  979
 Number of times we got 2  ...  954
 Number of times we got 3  ...  1006
 Number of times we got 4  ...  995
 Number of times we got 5  ...  999
 Number of times we got 6  ...  989
 Number of times we got 7  ...  1000
 Number of times we got 8  ...  1042
 Number of times we got 9  ...  1017
 The sum of the ten thousand random numbers was 45303
 The average of those numbers was 4.5303
 End

这符合我的期望; 即,平均值非常接近4.5,每个单独数字的分布接近一千。

更重要的是,有了这些数字,我可以肯定,这个生成器在真正生成一万个随机数时做得非常好,这些随机数确实是随机的。

这里有个困惑:我的老板说,如果机器真正执行其职责,真正给我们提供随机数,那么每个数字的分布应该是均匀的; 即,在一万次迭代中,我应该恰好得到一千个每个数字。

我尝试在使用X = math.random(0,9)的循环之前添加 math.randomseed(os.time()),基于StackOverflow上的其他对话。结果偏离更远,而不是更靠近。

我删除了math.randomseed(os.time())这一行,再次运行测试,得到了平均值为4.5007(这是我看过的最好的平均值)。

那么我发现了什么?什么都没有?随机数生成器实际上是一个随机数生成器?每个人已经知道了。

我证明了这个伪随机数生成器大约与我们期望的一样随机吗?

我有理由担心使用这些值吗?我将向常规发射器射击,并故意给他错误的数字。全范围测试每种情况太多了。我猜测,正确分布,16K枪击将使我确信芯片正在正确处理(故意错误的)值。

(读者请注意,我正在对多处理器系统进行V&V,我的Lua脚本正在模拟我们尚未拥有的系统部分的行为。)

在这种情况下,是否有办法让Lua生成每个数字恰好为一千个的数字math.random()函数?

如果可以,那么那真的是随机的吗?

点赞
用户1009479
用户1009479

首先,在使用math.random()之前,您需要运行math.randomseed()一次,并且最好丢弃前几个随机数,因为在某些实现中,前几个随机数不是那么随机的,有关详细信息,请参见Lua math.random not working

math.randomseed(os.time())
math.random(); math.random(); math.random()

其次,即使你翻转一枚完美平衡的硬币一千次,通常也不能确切地获得500次正面朝上和500次正面朝下。只是获得正面朝上的概率大约为500。如果实验做了很多次,你会预计头部的平均值是500,但是每次都不会精确地是500。

第三,是的,math.random()是伪随机数生成器。实际上,您无法仅使用计算机生成真正的随机数字。Lua math.random()在内部使用C库函数rand()。而且,C的rand()函数不是一个好的随机数生成器。如果随机性很重要,请使用更好的实现方法,例如C ++随机引擎或Linux上的dev / random

2014-03-13 07:54:51
用户107090
用户107090

有除了频率之外的其他测试。请参阅统计随机性。您可能想尝试它们。

如果你想要一个具有已知特性的Lua随机数生成器,请尝试lrandom,它是基于Mersenne Twister的。

2014-03-13 10:41:29
用户2579220
用户2579220

一个非常简单的测试是使用随机数序列作为(x, y)或(x, y, z)坐标并绘制它们。以下是一些现实世界中的例子:

2014-03-13 10:57:36