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()函数?
如果可以,那么那真的是随机的吗?
有除了频率之外的其他测试。请参阅统计随机性。您可能想尝试它们。
如果你想要一个具有已知特性的Lua随机数生成器,请尝试lrandom,它是基于Mersenne Twister的。
一个非常简单的测试是使用随机数序列作为(x, y)或(x, y, z)坐标并绘制它们。以下是一些现实世界中的例子:
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
首先,在使用
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()是伪随机数生成器。实际上,您无法仅使用计算机生成真正的随机数字。Luamath.random()在内部使用C库函数rand()。而且,C的rand()函数不是一个好的随机数生成器。如果随机性很重要,请使用更好的实现方法,例如C ++随机引擎或Linux上的dev / random。